1. //SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式]
  2. //应用产品: SMG12232ZK标准中文字符点阵型液晶显示模块
  3. // 本演示程序适用于SMG12232ZK液晶显示模块与MCS51系列单片机采用MCS51并行接口
  4. //方式的硬件连线方式。
  5. // 本演示程序包括ST7920兼容芯片的MCS51并行接口方式子程序集,SMG12232系列标准中文
  6. //字符点阵型液晶显示模块的接口子程序集,ST7920兼容芯片的液晶显示控制器的通用子程序
  7. //集,以及SMG12232系列标准中文字符点阵型液晶显示的演示子程序.
  8. // 本演示的内容为,在15列ASCII字符(7.5列中文)X2行的液晶显示屏上显示" SMG12232ZK ",
  9. //"中文字符图形点阵","液晶显示模块","长沙太阳人SUNMAN",所有数字0..9依次全屏显示
  10. //一遍,显示清屏,所有英文字母依次显示,显示自定义字符,图形模式图片显示.
  11. //-------------------------------------------------------------------------------
  12. //创建日期: 2009.11.02
  13. //软件环境: VW For Windows
  14. //硬件环境: AT89C52 MCU,MCS-51系列 MCU,etc.
  15. //创建人: 褚建军(chujianjun@sunman.cn),谭超(tanchao@sunman.cn).
  16. //技术支持: 电话(0731-84167806,84167807),传真(0731-84167807),网址(www.sunman.cn)
  17. //版权信息: 长沙太阳人电子有限公司版权所有,转载请指明出处.
  18. //参考网页: http:/www.sunman.cn/lcm/product/SMG12232ZK.html
  19. //-------------------------------------------------------------------------------
  20. #include <reg51.h>
  21. #include <intrins.h>
  22. //以下为演示程序的函数定义
  23. void exsample(void); //演示程序
  24. void exdelay(void); //演示延时子程序
  25. void putchar(unsigned int c); //定位写字符子程序
  26. void putstr(unsigned char code *s); //显示字符串子程序,字符码为0时退出
  27. void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s);
  28. void setcharcgram(unsigned char cindex,unsigned char code *s);
  29. //设置自定义字符点阵
  30. void charcursornext(void); //置字符位置为下一个有效位置子程序
  31. void putimage(unsigned char code *s); //显示图形子程序
  32. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);
  33. //显示指定大小的图形子程序
  34. void charlcdfill(unsigned int c); //整屏显示c代表的字符数据子程序
  35. void glcdfill(unsigned char d); //整屏显示d代表的字节数据子程序
  36. void glcdpos(void); //写入绘图区域内部RAM指针子程序
  37. void charlcdpos(void); //设置(CXPOS,CYPOS)内部DDRAM地址的子程序
  38. void lcdreset(void); //液晶显示控制器初始化子程序
  39. void delay3ms(void); //延时3MS子程序
  40. void lcdon(void); //LCD显示开启子程序
  41. void lcdoff(void); //LCD显示关闭子程序
  42. void lcdgraphon(void); //绘图区域显示开启子程序
  43. void lcdgraphoff(void); //绘图区域显示关闭子程序
  44. unsigned char lcdrd(void); //从液晶显示控制器读数据
  45. void lcdwd(unsigned char d); //送图形数据子程序
  46. void lcdwc(unsigned char c); //送指令子程序
  47. void lcdwaitidle(void); //控制器忙检测子程序
  48. //-------------------------------------------------------------------------------
  49. //SMG12232ZK产品引脚说明及演示连线
  50. //PIN1: VSS [电源地]-------------------VSS
  51. //PIN2: VDD [电源正极]-----------------VDD(+5V)
  52. //PIN3: NC [空脚]
  53. //PIN4: RS [数据/命令选择 数据1,命令0]-P3.0
  54. //PIN5: RW [读/写控制 读1,写0]--------P3.1
  55. //PIN6: E [使能信号 高有效]----------P3.2
  56. //PIN7: D0 [Data I/O]-----------------P1.0
  57. //PIN8: D1 [Data I/O]-----------------P1.1
  58. //PIN9: D2 [Data I/O]-----------------P1.2
  59. //PIN10:D3 [Data I/O]-----------------P1.3
  60. //PIN11:D4 [Data I/O]-----------------P1.4
  61. //PIN12:D5 [Data I/O]-----------------P1.5
  62. //PIN13:D6 [Data I/O]-----------------P1.6
  63. //PIN14:D7 [Data I/O]-----------------P1.7
  64. //PIN15:PSB [模块内部已选择,悬空]
  65. //PIN16:RST [复位端,低电平有效]--------VDD
  66. //PIN17:A [背光源正极]
  67. //PIN18:K [背光源负极]
  68. //请参见http://download.sunman.cn/lcm/product/1/SMG12232ZK.pdf
  69. //字符表参见http://download.sunman.cn/lcm/reference/ST7920_GB_CHARACTER_TABLE.pdf
  70. //芯片资料参见http://download.sunman.cn/lcm/reference/ST7920.pdf
  71. //-------------------------------------------------------------------------------
  72. //以下为产品接口引脚在演示程序中的预定义
  73. //用户在编写应用程序时,需按自己的实际硬件连线来重新定义
  74. sbit RSPIN = P3^0; // RS对应单片机引脚
  75. sbit RWPIN = P3^1; // RW对应单片机引脚
  76. sbit EPIN = P3^2; // E对应单片机引脚
  77. //-------------------------------------------------------------------------------
  78. //以下CXPOS,CYPOS变量用于指示当前操作字符的位置的预定义
  79. unsigned char CXPOS; //列方向地址指针(用于charlcdpos子程序)
  80. unsigned char CYPOS; //行方向地址指针(用于charlcdpos子程序)
  81.  
  82. //-------------------------------------------------------------------------------
  83. //以下GXPOS,GYPOS变量用于指示绘图区域RAM的位置的预定义
  84. //用户在编写应用程序时,需按自己的实际软件程序需要来重新定义
  85. unsigned char GXPOS; //列方向地址指针(用于glcdpos子程序)
  86. unsigned char GYPOS; //行方向地址指针(用于glcdpos子程序)
  87.  
  88. #define USERCHAR1CODE 0xffff //自定义字符1代码
  89. #define USERCHAR2CODE 0xfffd //自定义字符2代码
  90. #define USERCHAR3CODE 0xfffb //自定义字符3代码
  91. #define USERCHAR4CODE 0xfff9 //自定义字符4代码
  92.  
  93. unsigned char code CHAR1CGRAMTAB[]={
  94. 0x00,0x0f,
  95. 0x00,0x7f,
  96. 0x01,0xf0,
  97. 0x03,0xc0,
  98. 0x07,0x0f,
  99. 0x0e,0x3f,
  100. 0x1c,0xfe,
  101. 0x39,0xfc,
  102. 0x33,0xfc,
  103. 0x73,0xfe,
  104. 0x67,0xff,
  105. 0x67,0xe7,
  106. 0xcf,0xe3,
  107. 0xcf,0xe1,
  108. 0xcf,0xe4,
  109. 0xc0,0x06
  110. };
  111. unsigned char code CHAR2CGRAMTAB[]={
  112. 0xf0,0x00,
  113. 0xfe,0x00,
  114. 0x0f,0x80,
  115. 0x03,0xc0,
  116. 0xf0,0xe0,
  117. 0xfc,0x70,
  118. 0x7f,0x38,
  119. 0x3f,0x9c,
  120. 0x3f,0xcc,
  121. 0x7f,0xce,
  122. 0xff,0xe6,
  123. 0xe7,0xe6,
  124. 0xc7,0xf3,
  125. 0x87,0xff,
  126. 0x27,0xff,
  127. 0x60,0x03
  128. };
  129. unsigned char code CHAR3CGRAMTAB[]={
  130. 0xc0,0x07,
  131. 0xff,0xe7,
  132. 0xff,0xe7,
  133. 0xcf,0xe7,
  134. 0x67,0xe7,
  135. 0x67,0xff,
  136. 0x73,0xff,
  137. 0x33,0xff,
  138. 0x39,0xff,
  139. 0x1c,0xff,
  140. 0x0e,0x3f,
  141. 0x07,0x0f,
  142. 0x03,0xc0,
  143. 0x01,0xf0,
  144. 0x00,0x7f,
  145. 0x00,0x0f
  146. };
  147. unsigned char code CHAR4CGRAMTAB[]={
  148. 0xe0,0x03,
  149. 0xe7,0xf3,
  150. 0xe7,0xf3,
  151. 0xe7,0xf3,
  152. 0xe7,0xe6,
  153. 0xff,0xe6,
  154. 0xff,0xce,
  155. 0xff,0xcc,
  156. 0xff,0x9c,
  157. 0xff,0x38,
  158. 0xfc,0x70,
  159. 0xf0,0xe0,
  160. 0x03,0xc0,
  161. 0x0f,0x80,
  162. 0xfe,0x00,
  163. 0xf0,0x00
  164. };
  165. //-------------------------------------------------------------------------------
  166. //以下为图片库点阵代码
  167. //实际使用时请包含由SUNMAN图形点阵代码生成器.EXE自动生成的imagelib.c文件来替换该
  168. //部分
  169. unsigned char code Img_sunman_32x32[]={32,32,
  170. 0x00,0x0f,0xf0,0x00,
  171. 0x00,0x7f,0xfe,0x00,
  172. 0x01,0xf0,0x0f,0x80,
  173. 0x03,0xc0,0x03,0xc0,
  174. 0x07,0x0f,0xf0,0xe0,
  175. 0x0e,0x3f,0xfc,0x70,
  176. 0x1c,0xfe,0x7f,0x38,
  177. 0x39,0xfc,0x3f,0x9c,
  178. 0x33,0xfc,0x3f,0xcc,
  179. 0x73,0xfe,0x7f,0xce,
  180. 0x67,0xff,0xff,0xe6,
  181. 0x67,0xe7,0xe7,0xe6,
  182. 0xcf,0xe3,0xc7,0xf3,
  183. 0xcf,0xe1,0x87,0xff,
  184. 0xcf,0xe4,0x27,0xff,
  185. 0xc0,0x06,0x60,0x03,
  186. 0xc0,0x07,0xe0,0x03,
  187. 0xff,0xe7,0xe7,0xf3,
  188. 0xff,0xe7,0xe7,0xf3,
  189. 0xcf,0xe7,0xe7,0xf3,
  190. 0x67,0xe7,0xe7,0xe6,
  191. 0x67,0xff,0xff,0xe6,
  192. 0x73,0xff,0xff,0xce,
  193. 0x33,0xff,0xff,0xcc,
  194. 0x39,0xff,0xff,0x9c,
  195. 0x1c,0xff,0xff,0x38,
  196. 0x0e,0x3f,0xfc,0x70,
  197. 0x07,0x0f,0xf0,0xe0,
  198. 0x03,0xc0,0x03,0xc0,
  199. 0x01,0xf0,0x0f,0x80,
  200. 0x00,0x7f,0xfe,0x00,
  201. 0x00,0x0f,0xf0,0x00
  202. };
  203. //-------------------------------------------------------------------------------
  204.  
  205. void main(void)
  206. { while(1)
  207. { lcdreset(); //初始化液晶显示控制器
  208. exsample(); //演示程序
  209. }
  210. }
  211. void exsample(void) //演示程序
  212. { unsigned char i;
  213. //0.演示前的准备,LCD液晶显示控制器初始化,所有显示全清零
  214. lcdreset(); //液晶显示控制器初始化
  215. charlcdfill(' '); //显示清屏
  216.  
  217. //1.字符串演示: 在(2,0)字符位置显示" SMG12232ZK "
  218. putstrxy(2,0," SMG12232ZK "); //在(2,0)位置开始显示字符串
  219. exdelay(); //延时约300mS
  220. exdelay(); //延时约300mS
  221.  
  222. //2.字符串演示: 在(0,1)字符位置显示"中文字符图形点阵"
  223. putstrxy(0,1,"中文字符图形点阵"); //在(0,1)位置开始显示字符串
  224. exdelay(); //延时约300mS
  225. exdelay(); //延时约300mS
  226.  
  227. //3.字符串演示: 在(2,0)字符位置显示"液晶显示模块"
  228. putstrxy(2,0,"液晶显示模块"); //在(2,0)位置开始显示字符串
  229. exdelay(); //延时约300mS
  230. exdelay(); //延时约300mS
  231.  
  232. //4.字符串演示: 在(0,1)字符位置显示"长沙太阳人SUNMAN"
  233. putstrxy(0,1,"长沙太阳人SUNMAN"); //在(0,1)位置开始显示字符串
  234. exdelay(); //延时约300mS
  235. exdelay(); //延时约300mS
  236.  
  237. //5.字符填充演示: 整屏显示0..9 空格一遍
  238. for(i='0';i<'9'+1;i++)
  239. { charlcdfill(i); //整屏显示为i的值
  240. exdelay(); //延时约300mS
  241. }
  242. charlcdfill(' '); //显示清屏
  243. exdelay(); //延时约300mS
  244.  
  245. //6.字符演示: 依次显示A..Z 一遍
  246. for(i='A';i<'Z'+1;i++) //依次显示A..Z一遍
  247. { putchar(i); //当前位置显示为i的值
  248. exdelay(); //延时约300mS
  249. }
  250.  
  251. //7.自定义字符演示: 装入自定义字符点阵发生器
  252. setcharcgram(0,CHAR1CGRAMTAB); //装入自定义字符字符点阵
  253. setcharcgram(1,CHAR2CGRAMTAB);
  254. setcharcgram(2,CHAR3CGRAMTAB);
  255. setcharcgram(3,CHAR4CGRAMTAB); //装入自定义字符字符点阵
  256.  
  257. //8.自定义字符演示:在(4,0)(5,0)(4,1)(5,1)字符位置显示自定义字符1,2,3,4
  258. CXPOS=4,CYPOS=0;
  259. putchar(USERCHAR1CODE);
  260. exdelay(); //延时约300mS
  261. putchar(USERCHAR2CODE);
  262. exdelay(); //延时约300mS
  263. CXPOS=4,CYPOS=1;
  264. putchar(USERCHAR3CODE);
  265. exdelay(); //延时约300mS
  266. putchar(USERCHAR4CODE);
  267. exdelay(); //延时约300mS
  268. exdelay(); //延时约300mS
  269.  
  270. //9.图形模式演示: 在(0,0)点阵位置显示图片
  271. charlcdfill(' '); //显示清屏
  272. lcdgraphon(); //开图形模式
  273. GXPOS=0,GYPOS=0;
  274. putimage(Img_sunman_32x32);
  275. exdelay(); //延时约300mS
  276. exdelay(); //延时约300mS
  277. glcdfill(0); //图形区域清屏
  278. lcdgraphoff(); //关图形模式
  279. }
  280. void exdelay(void) //演示延时子程序
  281. { unsigned char i,j,k; //延时约300mS
  282. for(i=0;i<30;i++)
  283. for(j=0;j<64;j++)
  284. for(k=0;k<51;k++);
  285. }
  286. //-------------------------------------------------------------------------------
  287. //字符操作区域
  288. //12232ZK字符区域定义为:
  289. // CXPOS(0-15) 对应于第1列到第16列位置,每个字符列位置实际占位8点,总计对应128点
  290. // 由于显示只有122点,所以最后的6点不能显示出来.
  291. // CYPOS(0-1)对应于第1行到第2行,每个行位置实际占位16点,总计对应32点
  292. //警告:直接设置CXPOS的位置时,请将CXPOS的值设置为偶数,否则显示的字符值会不正确.
  293. //-------------------------------------------------------------------------------
  294. //以下为charlcdfill,putchar,putstr,setcharcgram为ST7920兼容芯片的液晶显示控制器
  295. //的通用子程序,putstrxy为扩充子程序.
  296. //-------------------------------------------------------------------------------
  297. //子程序名称:void charlcdfill(unsigned int c).
  298. //功能:整屏显示A代表的ASCII字符.
  299. //修改日期:2009.10.29
  300. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  301. //-------------------------------------------------------------------------------
  302. void charlcdfill(unsigned int c) //整屏显示A代表的ASCII字符子程序
  303. { for(CXPOS=CYPOS=0;1;)
  304. { putchar(c); //定位写字符
  305. if((CXPOS==0) && (CYPOS==0)) break;
  306. }
  307. }
  308. //-------------------------------------------------------------------------------
  309. //子程序名称:void putchar(unsigned int c).
  310. //功能:在(XPOS,YPOS)位置写单个字符点阵,若c>128 表示为中文字符,否则为西文字符
  311. //修改日期:2009.8.18
  312. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  313. //-------------------------------------------------------------------------------
  314. void putchar(unsigned int c) //定位写字符子程序
  315. { unsigned char d;
  316. if(c>128) //字符码大于128表示为汉字
  317. { if( (CXPOS&0x1)==1 ) //写汉字时,CXPOS字符位置在奇数位置,则
  318. { lcdwd(' '); //自动补添一个空格对齐后再显示汉字
  319. charcursornext(); //置字符位置为下一个有效位置
  320. }
  321. charlcdpos();
  322. if((c&0xff00)==0xff00) //若高位字节为0FFH则表示为自定义字符
  323. c=0xffff-c; //则转换为ST7920的字符码
  324. lcdwd(c/256); //写高位字符
  325. charcursornext();
  326. lcdwd(c&0xff); //写低位字符
  327. charcursornext();
  328. }
  329. else //字符码小于128表示为ASCII字符
  330. { charlcdpos();
  331. if( (CXPOS&0x1)==1 ) //写ASCII字符时,CXPOS字符位置在奇数位置,则
  332. { d=lcdrd(); //读高位字符
  333. charlcdpos();
  334. lcdwd(d); //重新写高位字符
  335. lcdwd(c);
  336. }
  337. else
  338. { lcdwd(c); //写ASCII字符时,CXPOS字符位置在偶数位置,则
  339. lcdwd(' '); //直接写入,同时自动补显一个空格.
  340. }
  341. charcursornext(); //置字符位置为下一个有效位置
  342. }
  343. }
  344. //-------------------------------------------------------------------------------
  345. //子程序名称:void putstr(unsigned char code *s).
  346. //功能:写字符串点阵,若*s=0 表示字符串结束.
  347. //修改日期:2009.8.18
  348. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  349. //-------------------------------------------------------------------------------
  350. void putstr(unsigned char code *s) //显示字符串子程序,字符码为0时退出
  351. { unsigned int c;
  352. while(1)
  353. { c=*s;
  354. s++;
  355. if(c==0) break;
  356. if(c<128)
  357. putchar(c);
  358. else
  359. { putchar(c*256+*s);
  360. s++;
  361. }
  362. }
  363. }
  364. //-------------------------------------------------------------------------------
  365. //子程序名称:void putstrxy(unsigned char cx,unsigned char cy,unsigned char *s).
  366. //功能:在(cx,cy)字符位置写字符串.
  367. //修改日期:2009.08.11
  368. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  369. //-------------------------------------------------------------------------------
  370. void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s)
  371. { //在(cx,cy)字符位置写字符串子程序
  372. CXPOS=cx; //置当前X位置为cx
  373. CYPOS=cy; //置当前Y位置为cy
  374. putstr(s);
  375. }
  376. //-------------------------------------------------------------------------------
  377. //子程序名称:void setcharcgram(unsigned char cindex,unsigned char code *s).
  378. //功能:将*s所指32字节点阵写到自定义字符cindex(0-3)中.
  379. //修改日期:2009.10.29
  380. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  381. //-------------------------------------------------------------------------------
  382. void setcharcgram(unsigned char cindex,unsigned char code *s)
  383. { unsigned char i;
  384. lcdwc(0x34); //扩充指令集,图形模式关闭
  385. lcdwc(0x02); //SR=0 激活CGRAM
  386. lcdwc(0x30); //恢复为基本指令集
  387. lcdwc( ((cindex&0x3)<<4) | 0x40); //设置CGRAM地址
  388. for(i=0;i<32;i++,s++) //写点阵数据
  389. lcdwd(*s);
  390. }
  391. //-------------------------------------------------------------------------------
  392. //以下putsizeimage为图形对象的基本子程序,putimage为图形对象的扩充子程序
  393. //-------------------------------------------------------------------------------
  394. //子程序名称:void putsizeimage(unsigned char XSIZE,unsigned YSIZE,
  395. // unsigned char code *s)
  396. //功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数
  397. // GXPOS仅取16的倍数).
  398. //修改日期:2009.10.29
  399. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  400. //-------------------------------------------------------------------------------
  401. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
  402. { unsigned char lx,ly,x;
  403. x=GXPOS;
  404. for(ly=0;ly<YSIZE;ly++,GYPOS++)
  405. { for(GXPOS=x,lx=0;lx<XSIZE;)
  406. { if((GXPOS&0x08)==0) glcdpos();
  407. lcdwd(*s);
  408. s++;
  409. lx+=8;
  410. GXPOS+=8;
  411. }
  412. }
  413. GXPOS=x;
  414. }
  415. //-------------------------------------------------------------------------------
  416. //子程序名称:void putimage(unsigned char code *s).
  417. //功能:在(XPOS,YPOS)位置绘制XSIZE[*s]列及YISZE[*(s+1)]行点阵的图形[*(s+2)].
  418. //修改日期:2009.8.18
  419. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  420. //-------------------------------------------------------------------------------
  421. void putimage(unsigned char code *s) //显示图形子程序
  422. { unsigned char XSIZE,YSIZE;
  423. XSIZE=*s;
  424. s++;
  425. YSIZE=*s;
  426. s++;
  427. putsizeimage(XSIZE,YSIZE,s);
  428. }
  429. //-------------------------------------------------------------------------------
  430. //以下为charlcdpos,charcursornext,lcdreset为ST7920兼容芯片的液晶显示控制器的
  431. //15ASCII字符X2行的SMG12232系列标准中文字符点阵型液晶显示模块的接口程序.
  432. //-------------------------------------------------------------------------------
  433. //子程序名称:void charlcdpos(void).
  434. //功能:设置坐标点(CXPOS,CYPOS)位置对应的内部RAM地址.
  435. //修改日期:2009.11.02
  436. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  437. //-------------------------------------------------------------------------------
  438. void charlcdpos(void) //设置坐标点(CXPOS,CYPOS)内部RAM地址的子程序
  439. { unsigned char ddaddr;
  440. if(CXPOS>15) CXPOS=0; //字符位置CXPOS的有效范围为(0到15)
  441. CYPOS&=0X1; //字符位置CYPOS的有效范围为(0到1)
  442. ddaddr=CXPOS/2;
  443. if(CYPOS==0) //(第一行)X: 第0----15个字符
  444. lcdwc(ddaddr|0x80); // DDRAM: 80----87H
  445. else //(第二行)X: 第0----15个字符
  446. lcdwc(ddaddr|0x90); // DDRAM: 90----97H
  447. }
  448. //-------------------------------------------------------------------------------
  449. //子程序名称:void charcursornext(void).
  450. //功能:置字符位置为下一个有效位置.
  451. //修改日期:2009.11.02
  452. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  453. //-------------------------------------------------------------------------------
  454. void charcursornext(void) //置字符位置为下一个有效位置子程序
  455. {
  456. CXPOS++; //字符位置加1
  457. if(CXPOS>15) CXPOS=0; //字符位置CXPOS的有效范围为(0到15)
  458. if(CXPOS==0) //字符位置CXPOS=0表示要换行
  459. { CYPOS++; //行位置加1
  460. CYPOS&=0X1; //字符位置CYPOS的有效范围为(0到1)
  461. }
  462. }
  463. //-------------------------------------------------------------------------------
  464. //子程序名称:void lcdreset(void)
  465. //功能:液晶显示控制器初始化
  466. //修改日期:2009.08.31
  467. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  468. //-------------------------------------------------------------------------------
  469. void lcdreset(void) //液晶显示控制器初始化子程序
  470. { lcdwc(0x33); //接口模式设置
  471. delay3ms(); //延时3MS
  472. lcdwc(0x30); //基本指令集
  473. delay3ms(); //延时3MS
  474. lcdwc(0x30); //重复送基本指令集
  475. delay3ms(); //延时3MS
  476. lcdwc(0x01); //清屏控制字
  477. delay3ms(); //延时3MS
  478. lcdwc(0x06); //显示光标移动设置
  479. lcdon(); //开显示
  480. }
  481. void delay3ms(void) //延时3MS子程序
  482. { unsigned char i,j,k;
  483. for(i=0;i<3;i++)
  484. for(j=0;j<64;j++)
  485. for(k=0;k<51;k++);
  486. }
  487. //-------------------------------------------------------------------------------
  488. //子程序名称:void glcdfill(unsigned char d).
  489. //功能:整屏显示d表示的字节数据.
  490. //修改日期:2009.11.02
  491. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  492. //-------------------------------------------------------------------------------
  493. void glcdfill(unsigned char d) //整屏显示d代表的字数据子程序
  494. { unsigned char i;
  495. GXPOS=0;
  496. GYPOS=0;
  497. while(GYPOS<32)
  498. { glcdpos();
  499. for(i=0;i<16;i++)
  500. lcdwd(d);
  501. GYPOS++;
  502. }
  503. GYPOS=0;
  504. }
  505. //-------------------------------------------------------------------------------
  506. //子程序名称:void glcdpos(void)
  507. //功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针.
  508. //修改日期:2009.11.02
  509. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  510. //-------------------------------------------------------------------------------
  511. void glcdpos(void) //写入绘图区域内部RAM指针子程序
  512. { lcdwc(0x36); //扩展指令集
  513. lcdwc((GYPOS&0x1f)|0x80); //先送Y地址
  514. lcdwc((GXPOS/16)|0x80); //再送X地址
  515. lcdwc(0x30); //恢复为基本指令集
  516. }
  517. //-------------------------------------------------------------------------------
  518. //子程序名称:lcdon()
  519. //功能:开启LCD显示
  520. //修改日期:2009.10.28
  521. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  522. //-------------------------------------------------------------------------------
  523. void lcdon(void) //LCD显示开启子程序
  524. { lcdwc(0x30); //设置为基本指令集
  525. lcdwc(0x0c);
  526. }
  527. //-------------------------------------------------------------------------------
  528. //子程序名称:lcdoff()
  529. //功能:关闭LCD显示
  530. //修改日期:2009.10.28
  531. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  532. //-------------------------------------------------------------------------------
  533. void lcdoff(void) //LCD显示关闭子程序
  534. { lcdwc(0x30); //设置为基本指令集
  535. lcdwc(0x08);
  536. }
  537. //-------------------------------------------------------------------------------
  538. //子程序名称:lcdgraphon()
  539. //功能:开启绘图区域显示
  540. //修改日期:2009.10.28
  541. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  542. //-------------------------------------------------------------------------------
  543. void lcdgraphon(void) //绘图区域显示开启子程序
  544. { lcdwc(0x36);
  545. lcdwc(0x30); //恢复为基本指令集
  546. }
  547. //-------------------------------------------------------------------------------
  548. //子程序名称:lcdgraphoff()
  549. //功能:关闭绘图区域显示
  550. //修改日期:2009.10.28
  551. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  552. //-------------------------------------------------------------------------------
  553. void lcdgraphoff(void) //绘图区域显示关闭子程序
  554. { lcdwc(0x34);
  555. lcdwc(0x30); //恢复为基本指令集
  556. }
  557. //-------------------------------------------------------------------------------
  558. //以下lcdwc,lcdwd为ST7920兼容芯片的MCS51三线式串行接口方式的基本子程序,lcdwaitidle
  559. //为内部子程序.
  560. //-------------------------------------------------------------------------------
  561. //子程序名称:unsigned char lcdrd(void).
  562. //功能:从液晶显示控制器读数据.
  563. //修改日期:2009.10.29
  564. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  565. //-------------------------------------------------------------------------------
  566. unsigned char lcdrd(void) //从液晶显示控制器读数据
  567. { unsigned char d;
  568. lcdwaitidle(); //ST7920液晶显示控制器忙检测
  569. RSPIN=1; //RS=1 RW=1 E=高脉冲
  570. RWPIN=1;
  571. EPIN=1;
  572. _nop_();
  573. d=P1;
  574. EPIN=0;
  575. return d;
  576. }
  577. //-------------------------------------------------------------------------------
  578. //子程序名称:void lcdwd(unsigned char d).
  579. //功能:向液晶显示控制器写数据.
  580. //修改日期:2009.10.29
  581. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  582. //-------------------------------------------------------------------------------
  583. void lcdwd(unsigned char d) //向液晶显示控制器写数据
  584. { lcdwaitidle(); //ST7920液晶显示控制器忙检测
  585. P1=d;
  586. RSPIN=1; //RS=1 RW=0 E=高脉冲
  587. RWPIN=0;
  588. EPIN=1;
  589. _nop_();
  590. EPIN=0;
  591. }
  592. //-------------------------------------------------------------------------------
  593. //子程序名称:lcdwc(unsigned char c).
  594. //功能:向液晶显示控制器送指令.
  595. //修改日期:2009.10.29
  596. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  597. //-------------------------------------------------------------------------------
  598. void lcdwc(unsigned char c) //向液晶显示控制器送指令
  599. { lcdwaitidle(); //ST7920液晶显示控制器忙检测
  600. P1=c;
  601. RSPIN=0; //RS=0 RW=0 E=高脉冲
  602. RWPIN=0;
  603. EPIN=1;
  604. _nop_();
  605. EPIN=0;
  606. }
  607. //-------------------------------------------------------------------------------
  608. //子程序名称:void lcdwaitidle(void).
  609. //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
  610. //修改日期:2009.10.30
  611. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  612. //-------------------------------------------------------------------------------
  613. void lcdwaitidle(void) //控制器忙检测子程序
  614. { unsigned char i;
  615. P1=0xff;
  616. RSPIN=0;
  617. RWPIN=1;
  618. EPIN=1;
  619. for(i=0;i<20;i++) //
  620. if( (P1&0x80) != 0x80 ) break; //D7=0 空闲退出
  621. EPIN=0;
  622. }

SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式]的更多相关文章

  1. SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言]

    //SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言][MCS51总线接口方式] //应用产品: SMG12232A2标准图形点阵型液晶显示模块 // 本演示程序适用于SMG1 ...

  2. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  3. 如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  4. 如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)

    当前进展: 一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计 ...

  5. 拓普微智能TFT液晶显示模块

    关键词: 串口屏, 液晶屏, TFT,人机界面 概述: 智能模块(Smart LCD)是专为工业显示应用而设计的TFT液晶显示模块. 模块自带主控IC.Flash存储器.实时嵌入式操作系统,客户主机可 ...

  6. Python标准库笔记(8) — pprint模块

    struct模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串. Python版本: 2.x & 3.x 该模块作用是完成Python数值和C语言结构体的Pyt ...

  7. 12864点阵液晶显示模块的原理和实例程序(HJ12864M-1)

    12864点阵液晶显示模块(LCM)就是由 128*64个液晶显示点组成的一个128列*64行的阵列.每个显示点对应一位二进制数,1表示亮,0表示灭.存储这些点阵信息的RAM称为显示数据存 储器.要显 ...

  8. LCD1602液晶显示模块的单片机驱动深入详解之软件篇(AVR)

    LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前 ...

  9. TOPWAY智能彩色TFT液晶显示模块

    TOPWAY 20年来专注工业显示, 以为全球工业用户提供稳定可靠和容易使用的液晶显示模块为己任, 智能彩色TFT液晶显示模块(以下简称智能模块), 就是我们在容易使用TFT 彩色液晶显示方向上为广大 ...

随机推荐

  1. Dapper使用方法

    这里记下Dapper容易忘的使用方法: 返回的数据可以有相同名称的列,会分配到不同的类上,默认使用Id这个列作为分割列 connection.Open();  //手动打开的话会保持长连接,否则每次查 ...

  2. mysql 连接多行 合并多行

    group_concat() select group_concat(id) from xxxx -------------------------------------------- id1,id ...

  3. [Windows Azure] Querying Tables and Entities

    Constructing Filter Strings When constructing a filter string, keep these rules in mind: Use the log ...

  4. spring +hibernate 启动优化【转】

    最近在负责一个大项目,项目组成员包括项目经理大概10个人左右.项目技术用struts+spring+hibernate实现.项目的规模相对来说是比较大的,总共有10大模块,每个大模块又分为有十几个.甚 ...

  5. IOS 数组分组 Grouped NSArray

    NSMutableSet *set=[NSMutableSet set]; [_list enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BO ...

  6. 下一代Jquery模板-----JsRender

    在ASP.NET MVC利用PagedList分页(二)PagedList+Ajax+JsRender中提到了JsRender.JsRedner和JsViews(JsViews是再JsRender基础 ...

  7. ****JFinal 部署在 Tomcat 下推荐方法

    首先明确一下 JFinal 项目是标准的 java web 项目,其部署方式与普通 java web 项目没有任何差别.Java Web 项目在 Tomcat 下部署有一些不必要的坑需要避免 经常有人 ...

  8. POJ2635——The Embarrassed Cryptographer(高精度取模+筛选取素数)

    The Embarrassed Cryptographer DescriptionThe young and very promising cryptographer Odd Even has imp ...

  9. java事务管理(二)

    数据库事务和Spring事务是一般面试都会被提到,很多朋友写惯了代码,很少花时间去整理归纳这些东西,结果本来会的东西,居然吞吞吐吐答不上来. 下面是我收集到一些关于Spring事务的问题,希望能帮助大 ...

  10. dom解析器机制 web基本概念 tomcat

    0 作业[cn.itcast.xml.sax.Demo2]   1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...