找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2468|回复: 1
打印 上一主题 下一主题
收起左侧

[原创设计]STC单片机用无字库12864显示中考倒计时天数 附源程序

[复制链接]
跳转到指定楼层
楼主
刚学单片机不久,刚好手上买了12864点阵屏,孩子快中考了,为方便不用每天手动给他更换倒数天数,就琢磨着用单片机加12864显示屏弄一个自动倒计时天数的小玩意,略表心意的同时,也让自己能有所提高。

硬件:
STC单片机(STC15W408AS)的开发板;
无字库的控制芯片0107 /0108并口LCD12864,借用开发板已有的串并转换芯片实现串行。
因为没接触过过12864显示屏,所以一开始光点亮出字,就废了我几天时间。一开始光屏幕背光亮,没有点阵的阴影出现。搞明白负压输出电路和对比度调节电位器后,才将点阵显示弄好。

软件:
需求变更:天数每天自动减一,显示时去掉小时、分钟和秒数;
在买的开发板配套的软件中,有12864无字库的测试代码。用字模软件(Sunman字符图形点阵代码生成器),选SMG12864C,生成小字的数组,包含“距中考还有”这5个汉字16*16;为美观和醒目,又生成了大字的数组,包含“天”这1个汉字32*32,和“0-9”十个数,16*32;

通过更改无字库测试程序,主要是删除了画线等函数和语句,增加了大字的字符、字符串显示函数,可以按意图显示出静态文字和数字了。
增加定时器中断,加上倒计时的天、时、分、秒语句,实现自动计时。
下来遇到的难题,就是如何动态显示数字,让减少的天数这个变量和大字符的数组关联起来?这个问题困扰了我好几天,终于在今天搞懂了字符指针含义,通过自建一个将数字变更成字符数组对应元素的函数void num2str(unsigned int dd),在putchar子函数的参数里将数字和对应地址绑到一起,就可以显示变量了。
完整源程序见附件。因借用了测试源代码,自己修改添加后,里面会有些冗余或不合理的地方,欢迎指正!

最后但并非不重要的是,要感谢此论坛,给了我很多学习的资料和思路。
作为第一篇发帖,在编辑帖子里总看不到图片显示,图片和文字排版可能混乱,抱歉。。。以此输出聊表谢意,并与大家共勉!


12864引脚定义.png (13.39 KB, 下载次数: 45)

12864引脚定义

12864引脚定义

51hei图片_202005251637462.jpg (53.68 KB, 下载次数: 67)

效果1

效果1

51hei图片_20200525163746.jpg (75.4 KB, 下载次数: 46)

51hei图片_20200525163746.jpg

51hei图片_20200525163745.jpg (62.52 KB, 下载次数: 43)

51hei图片_20200525163745.jpg

51hei图片_202005251637461.jpg (56.38 KB, 下载次数: 45)

51hei图片_202005251637461.jpg

main2days_countdown.7z

6.58 KB, 下载次数: 28, 下载积分: 黑币 -5

倒计数天

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:741842 发表于 2020-5-25 16:52 | 只看该作者
也不知发成功没有测试一下

单片机源程序如下:
  1. //SMG12864C标准图形点阵型液晶显示模块的演示程序[C51编程语言][MCS51模拟口线接口方式]
  2. //应用产品: SMG12864C SMG12864BV SMG12864A SMG12864D3 标准图形点阵型液晶显示模块
  3. //  本演示程序适用于SMG12864C液晶显示模块与MCS51系列单片机采用MCS51模拟口线的
  4. //硬件连线方式。
  5. //  本演示程序包括KS0108B兼容芯片的MCS51模拟口线接口子程序集,KS0108B兼容芯片的12864
  6. //液晶显示模块的基本子程序,12864系列绘图子程序集,12864系列图形子程序集,12864系列
  7. //精简中英文字库子程序集,以及SMG12864C系列标准图形点阵型液晶显示的演示子程序.
  8. //  本演示的内容为,在128列X64行的点阵液晶显示屏上清屏,图片演示,英文字符串演示,
  9. //中文字符串演示,反白显示字符串,绘制矩形,写点,绘制直线,全屏显示.
  10. //-------------------------------------------------------------------------------
  11. //创建日期: 2020.5.18
  12. //软件环境: VW For Windows
  13. //硬件环境: STC MCU,MCS-51系列 MCU,etc.
  14. //工程师  :YF
  15. //-------------------------------------------------------------------------------
  16. //#include <stc15.h>
  17. #include <reg51.h>
  18. #include <intrins.h>

  19. signed char second=0,minute=0,hour=12,count=0;        //从中午开始计时就改hour
  20. unsigned int day=53;
  21. void num2str(unsigned int dd);
  22. void time0_init();
  23. //以下为演示程序的函数定义
  24. void exsample(void);                    //演示程序
  25. void exdelay(void);                     //演示延时子程序
  26. void putchar(unsigned int c);           //定位写字符子程序
  27. void putcharD(unsigned int d);            //定位写大字符子程序
  28. void putstr(unsigned char code *s);     //显示字符串子程序,字符码为0时退出
  29. void putstrD(unsigned char code *t);      //显示大字符串子程序,字符码为0时退出
  30. unsigned char code *getchinesecodepos(unsigned int ac);
  31. unsigned char code *getChn_Codepos(unsigned int ad);  //中文大字符
  32. unsigned char code *getenglishcodepos(unsigned char ac);
  33. unsigned char code *getEng_Codepos(unsigned char ad);   //英文大字符
  34. void putimage(unsigned char code *s);   //显示图形子程序
  35. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);
  36.                                         //显示指定大小的图形子程序
  37. // void point(bit b);
  38. // void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
  39. // void lineto(unsigned char x1,unsigned char y1,bit b);//绘制(XPOS,YPOS)-(X1,Y1)的直线
  40. // void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
  41. void lcdfill(unsigned char d);          //整屏显示d代表的字节数据子程序
  42. void lcdpos(void);                      //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
  43. void lcdreset(void);                    //液晶显示控制器初始化子程序
  44. void setlcdvoltage(unsigned char vol);   //LCD电压设置
  45. void lcdwd(unsigned char d);            //送图形数据子程序
  46.   
  47. void lcdwc(unsigned char c);            //送指令子程序
  48. void lcdwaitidle(void);                 //忙检测子程序

  49. void lcdwd1(unsigned char d);           //送图形数据子程序

  50. void lcdwc1(unsigned char c);           //送指令子程序
  51. void lcdwaitidle1(void);                //忙检测子程序
  52. void lcdwd2(unsigned char d);           //送图形数据子程序

  53. void lcdwc2(unsigned char c);           //送指令子程序
  54. void lcdwaitidle2(void);                //忙检测子程序
  55. //-------------------------------------------------------------------------------
  56. //SMG12864C产品引脚说明及演示连线
  57. //PIN1: VSS  [电源地]
  58. //PIN2: VDD  [电源正极]
  59. //PIN3: Vo   [LCD偏压输入]
  60. //PIN4: RS   [数据/命令选择端 1:数据 0:命令]
  61. //PIN5: RW   [读写信号选择端 1:读操作 0:写操作]
  62. //PIN6: E    [使能信号输入 高有效]
  63. //PIN7: DB0  [Data I/O]
  64. //PIN8: DB1  [Data I/O]
  65. //PIN9: DB2  [Data I/O]
  66. //PIN10:DB3  [Data I/O]
  67. //PIN11:DB4  [Data I/O]
  68. //PIN12:DB5  [Data I/O]
  69. //PIN13:DB6  [Data I/O]
  70. //PIN14:DB7  [Data I/O]
  71. //PIN15:CS1  [片选1信号输入 高有效]
  72. //PIN16:CS2  [片选2信号输入 高有效]
  73. //PIN17:RST  [复位信号输入(H:正常工作,L:复位)]
  74. //PIN18:VEE  [LCD驱动负压输出(-10V)]
  75. //PIN19:EL-E [EL 使能端(低电平有效)]
  76. //PIN20:NC   [空脚]
  77. //注:8031的晶振频率为12MHz.
  78. //请参见http://download.sunman.cn/lcm/product/1/SMG12864C.pdf

  79. /*************        本地变量声明        **************/


  80. void Send_595(unsigned char dat);
  81. void Send_byte_over(unsigned char sda);

  82. sfr AUXR        =   0x8E;   //0000,0000 辅助寄存器
  83. sfr  P4  = 0xe8;
  84. sbit P46 = P4^6;
  85. sbit P45 = P4^5;       //ISP下载需勾选"ALE脚用作P4.5口"
  86. sbit P44 = P4^4;
  87. sbit P43 = P4^3;
  88. sbit P42 = P4^2;
  89. sbit P41 = P4^1;
  90. sbit P40 = P4^0;
  91. sfr P5   = 0xC8;
  92. //-------------------------------------------------------------------------------
  93. //以下为产品接口引脚在演示程序中的预定义
  94. //用户在编写应用程序时,需按自己的实际硬件连线来重新定义
  95. sbit RS  = P3^5;                       // RS对应单片机引脚
  96. sbit RW  = P3^4;                       // RW对应单片机引脚
  97. sbit EN  = P3^3;                       // E对应单片机引脚
  98. sbit CS1 = P3^2;                       // CS1对应单片机引脚
  99. sbit CS2 = P3^1;                       // CS2对应单片机引脚
  100. sbit RST = P5^5;

  101. sbit        P_HC595_SRCLK = P1^0;        //pin 11        SRCLK        Shift data clock
  102. sbit        P_HC595_RCLK  = P3^7;        //pin 12        RCLk        store (latch) clock
  103. sbit        P_HC595_SER   = P3^6;        //pin 14        SER                data input
  104. //-------------------------------------------------------------------------------
  105. //以下XPOS,YPOS变量用于指示当前操作点的位置的预定义
  106. //用户在编写应用程序时,需按自己的实际软件程序需要来重新定义
  107. unsigned char XPOS;                     //列方向LCD点阵位置指针
  108. unsigned char YPOS;                     //行方向LCD点阵位置指针
  109. bit CharImageReverse;                   //字符及图形的反显控制,0(正常显示),1(反显)

  110. #define XDOTS   128                     //图形空间X方向大小
  111. #define YDOTS   64                      //图形空间X方向大小

  112. //-------------------------------------------------------------------------------
  113. //以下为精简版中英文字库
  114. //实际使用时请包含由Sunman精简版中英文字符库代码生成器.exe自动生成的charlib.c文
  115. //文件来替换该部分
  116. #define ENGLISHCHARNUMBER  1       //精简版英文字符库中的英文字符的个数
  117. #define CHINESECHARNUMBER  5       //精简版中文字符库中的中文字符的个数
  118. #define ENGLISHCHARSIZE    8       //英文字符X方向显示点的个数
  119. #define CHINESECHARSIZE    16      //中文字符X方向及中英文字符Y方向显示点的个数
  120. #define ENGLISHCHARDOTSIZE 16      //单个英文字符点阵的字节数
  121. #define CHINESECHARDOTSIZE 32      //单个中文字符点阵的字节数

  122. unsigned int code EnglishCode[]={
  123. 0x20     //字符001:[ ]
  124. };

  125. unsigned int code ChineseCode[]={
  126. 0xbbb9,  //字符001:[还]
  127. 0xbee0,  //字符002:[距]
  128. 0xbfbc,  //字符003:[考]
  129. 0xd3d0,  //字符004:[有]
  130. 0xd6d0   //字符005:[中]
  131. };

  132. unsigned char code EnglishCharDot[]={
  133. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符001:[ ]
  134. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  135. };

  136. unsigned char code ChineseCharDot[]={
  137. 0x40,0x00,0x40,0x40,0x42,0x20,0xcc,0x1f,   //字符001:[还]
  138. 0x00,0x20,0x00,0x42,0x02,0x41,0x82,0x40,
  139. 0x42,0x40,0xf2,0x5f,0x0e,0x40,0x42,0x40,
  140. 0x82,0x40,0x02,0x43,0x00,0x40,0x00,0x00,
  141. 0x00,0x20,0x3e,0x3f,0x22,0x20,0xe2,0x1f,   //字符002:[距]
  142. 0x22,0x11,0x3e,0x11,0x00,0x00,0xfe,0x7f,
  143. 0x22,0x44,0x22,0x44,0x22,0x44,0x22,0x44,
  144. 0x22,0x44,0xe2,0x47,0x02,0x40,0x00,0x00,
  145. 0x20,0x10,0x20,0x08,0x24,0x04,0x24,0x02,   //字符003:[考]
  146. 0x24,0x01,0x24,0x0d,0xbf,0x0b,0x64,0x09,
  147. 0x24,0x49,0x34,0x89,0x28,0x49,0x24,0x39,
  148. 0x22,0x01,0x20,0x00,0x20,0x00,0x00,0x00,
  149. 0x04,0x04,0x04,0x02,0x04,0x01,0x84,0x00,   //字符004:[有]
  150. 0xe4,0xff,0x3c,0x09,0x27,0x09,0x24,0x09,
  151. 0x24,0x09,0x24,0x49,0x24,0x89,0xe4,0x7f,
  152. 0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,
  153. 0x00,0x00,0x00,0x00,0xf0,0x0f,0x10,0x04,   //字符005:[中]
  154. 0x10,0x04,0x10,0x04,0x10,0x04,0xff,0xff,
  155. 0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,
  156. 0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00
  157. };
  158. //本文件由Sunman精简版中英文字符库代码生成器.exe自动生成
  159. //字节方向:[垂直] 字位顺序:[从低到高]
  160. //中文字体:[华文新魏] 英文字体:[华文新魏] 字体大小:[32]
  161. //下面是大字体的数字和汉字天;楷体不完整;
  162. #define ENG_NUMBER  10      //精简版英文字符库中的英文字符的个数
  163. #define CHN_NUMBER  1       //精简版中文字符库中的中文字符的个数
  164. #define ENG_SIZE    16      //英文字符X方向显示点的个数
  165. #define CHN_SIZE    32      //中文字符X方向及中英文字符Y方向显示点的个数
  166. #define ENG_DOTSIZE 64      //单个英文字符点阵的字节数
  167. #define CHN_DOTSIZE 128     //单个中文字符点阵的字节数

  168. unsigned int code Eng_Code[]={
  169. 0x30,    //字符001:[0]
  170. 0x31,    //字符002:[1]
  171. 0x32,    //字符003:[2]
  172. 0x33,    //字符004:[3]
  173. 0x34,    //字符005:[4]
  174. 0x35,    //字符006:[5]
  175. 0x36,    //字符007:[6]
  176. 0x37,    //字符008:[7]
  177. 0x38,    //字符009:[8]
  178. 0x39     //字符010:[9]
  179. };

  180. unsigned int code Chn_Code[]={
  181. 0xccec   //字符001:[天]
  182. };

  183. unsigned char code Eng_Dot[]={
  184. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符001:[0]
  185. 0x00,0xfe,0x07,0x00,0x80,0x03,0x1c,0x00,
  186. 0x40,0x00,0x60,0x00,0x20,0x00,0xc0,0x00,
  187. 0x10,0x00,0x80,0x00,0x18,0x00,0x80,0x01,
  188. 0x18,0x00,0x80,0x01,0x18,0x00,0x80,0x01,
  189. 0x18,0x00,0x80,0x01,0x18,0x00,0x80,0x00,
  190. 0x30,0x00,0x40,0x00,0x60,0x00,0x20,0x00,
  191. 0xc0,0x01,0x1c,0x00,0x00,0x00,0x00,0x00,
  192. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符002:[1]
  193. 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,
  194. 0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
  195. 0xf0,0xff,0xff,0x01,0x30,0x00,0x80,0x01,
  196. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  197. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  198. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  199. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  200. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符003:[2]
  201. 0x00,0x00,0xc0,0x01,0x60,0x00,0xe0,0x01,
  202. 0x30,0x00,0xb0,0x01,0x38,0x00,0x98,0x01,
  203. 0x18,0x00,0x98,0x01,0x18,0x00,0x8c,0x01,
  204. 0x18,0x00,0x86,0x01,0x18,0x00,0x83,0x01,
  205. 0x38,0x80,0x81,0x01,0x30,0xc0,0x80,0x01,
  206. 0x60,0x70,0x80,0x01,0xc0,0x1f,0x80,0x01,
  207. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  208. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符004:[3]
  209. 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,
  210. 0x30,0x00,0x80,0x01,0x38,0x60,0x80,0x01,
  211. 0x18,0x60,0x80,0x01,0x18,0x60,0x80,0x01,
  212. 0x18,0x70,0x80,0x01,0x18,0x50,0xc0,0x01,
  213. 0x38,0xd0,0xc0,0x00,0x30,0x88,0x60,0x00,
  214. 0xe0,0x87,0x73,0x00,0x80,0x03,0x1f,0x00,
  215. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  216. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符005:[4]
  217. 0x00,0x00,0x07,0x00,0x00,0xc0,0x06,0x00,
  218. 0x00,0x60,0x06,0x00,0x00,0x10,0x06,0x00,
  219. 0x00,0x08,0x06,0x00,0x00,0x06,0x06,0x00,
  220. 0x00,0x03,0x06,0x00,0x80,0x01,0x06,0x00,
  221. 0xc0,0x00,0x06,0x00,0xe0,0x00,0xc6,0x01,
  222. 0xf0,0xff,0xff,0x01,0x00,0x00,0x06,0x00,
  223. 0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
  224. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符006:[5]
  225. 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,
  226. 0x00,0x10,0xc0,0x01,0x80,0x1f,0xc0,0x01,
  227. 0x38,0x18,0x80,0x01,0x18,0x18,0x80,0x01,
  228. 0x18,0x18,0xc0,0x01,0x18,0x18,0xc0,0x00,
  229. 0x18,0x18,0xc0,0x00,0x18,0x18,0x60,0x00,
  230. 0x18,0x30,0x60,0x00,0x18,0x70,0x38,0x00,
  231. 0x18,0xc0,0x0f,0x00,0x00,0x00,0x00,0x00,
  232. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符007:[6]
  233. 0x00,0xc0,0x0f,0x00,0x00,0xf8,0x3f,0x00,
  234. 0x00,0x46,0x40,0x00,0x80,0x41,0xc0,0x00,
  235. 0xc0,0x20,0x80,0x01,0x60,0x20,0x80,0x01,
  236. 0x20,0x30,0x80,0x01,0x30,0x30,0x80,0x01,
  237. 0x10,0x30,0x80,0x01,0x18,0x30,0x80,0x00,
  238. 0x10,0x60,0xc0,0x00,0x00,0xe0,0x60,0x00,
  239. 0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,
  240. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符008:[7]
  241. 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
  242. 0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
  243. 0x30,0x00,0xf0,0x01,0x30,0x00,0x7c,0x00,
  244. 0x30,0x00,0x0f,0x00,0x30,0xc0,0x01,0x00,
  245. 0x30,0x60,0x00,0x00,0x30,0x18,0x00,0x00,
  246. 0x30,0x06,0x00,0x00,0xb0,0x03,0x00,0x00,
  247. 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  248. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符009:[8]
  249. 0x00,0x00,0x00,0x00,0xc0,0x07,0x3f,0x00,
  250. 0x60,0x8c,0xe1,0x00,0x30,0x90,0xc0,0x00,
  251. 0x10,0x70,0x80,0x01,0x18,0x60,0x80,0x01,
  252. 0x18,0x60,0x80,0x01,0x18,0x60,0x80,0x01,
  253. 0x18,0x60,0x80,0x01,0x18,0xd0,0x80,0x00,
  254. 0x30,0xd8,0xc0,0x00,0x60,0x8c,0x61,0x00,
  255. 0xc0,0x03,0x1f,0x00,0x00,0x00,0x00,0x00,
  256. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符010:[9]
  257. 0x00,0x0f,0x00,0x00,0xc0,0x39,0x00,0x00,
  258. 0x20,0x60,0x00,0x00,0x30,0x40,0x80,0x01,
  259. 0x10,0xc0,0x80,0x01,0x18,0xc0,0x80,0x00,
  260. 0x18,0xc0,0xc0,0x00,0x18,0xc0,0x40,0x00,
  261. 0x18,0x40,0x20,0x00,0x10,0x40,0x38,0x00,
  262. 0x30,0x20,0x0c,0x00,0x60,0xb0,0x07,0x00,
  263. 0x80,0xff,0x01,0x00,0x00,0x00,0x00,0x00
  264. };

  265. unsigned char code Chn_Dot[]={
  266. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   //字符001:[天]
  267. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  268. 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
  269. 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,
  270. 0x00,0x00,0xc0,0x00,0x00,0xc0,0x40,0x00,
  271. 0x00,0x40,0x20,0x00,0x80,0x61,0x10,0x00,
  272. 0x80,0x63,0x08,0x00,0x80,0x63,0x03,0x00,
  273. 0x80,0xfb,0x03,0x00,0xc0,0x33,0x03,0x00,
  274. 0xc0,0x31,0x02,0x00,0xc0,0x10,0x04,0x00,
  275. 0xe0,0x10,0x00,0x00,0x40,0x18,0x00,0x00,
  276. 0x00,0x18,0x30,0x00,0x00,0x10,0xe0,0x00,
  277. 0x00,0x00,0xe0,0x01,0x00,0x00,0xc0,0x01,
  278. 0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0x01,
  279. 0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,
  280. 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
  281. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  282. };


  283. /*------------------------------------------------
  284. uS延时函数,含有输入参数 unsigned char t,无返回值
  285. unsigned char 是定义无符号字符变量,其值的范围是
  286. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  287. 长度如下 T=tx2+5 uS
  288. ------------------------------------------------*/
  289. void DelayUs2x(unsigned char t)
  290. {   
  291. while(--t);
  292. }
  293. /*------------------------------------------------
  294. mS延时函数,含有输入参数 unsigned char t,无返回值
  295. unsigned char 是定义无符号字符变量,其值的范围是
  296. 0~255 这里使用晶振12M,精确延时请使用汇编
  297. ------------------------------------------------*/
  298. void DelayMs(unsigned char t)
  299. {
  300.      
  301. while(t--)
  302. {
  303.      //大致延时100uS
  304.      DelayUs2x(50);
  305.            DelayUs2x(50);
  306. }
  307. }


  308. ////-------------------------------------------------------------------------------
  309. ////以下为图片库点阵代码
  310. ////实际使用时请包含由SUNMAN图形点阵代码生成器.EXE自动生成的imagelib.c文件来替换

  311. void TM0_Isr() interrupt 1 using 1
  312. {
  313.          count++;
  314.         if(count==100)
  315.         {
  316.            count=0;
  317.            second--;
  318.            if(second<0)
  319.            {
  320.                         second=59;
  321.                         minute--;
  322.                         if(minute<0)
  323.                         {
  324.                                  minute=59;
  325.                                  hour--;
  326.                                  if(hour<0)
  327.                                          {
  328.                                                 hour=24;
  329.                                                 day--;
  330.                                          }
  331.                                         if(day==0)
  332.                                                  {
  333.                                                         day=99;
  334.                                                  }
  335.                         }   
  336.                         
  337.                 }
  338.                   
  339.         }
  340.       
  341. }
  342. void time0_init()
  343. {   
  344.     //AUXR |= 0x80;                   //定时器0为1T模式
  345.     AUXR &= 0x7f;                   //定时器0为12T模式
  346.     TMOD = 0x00;
  347.     TL0 = (65536-9217)%256;                                 //10ms
  348.     TH0 = (65536-9217)/256;
  349.     TR0 = 1;                                    //启动定时器
  350.     ET0 = 1;                                    //使能定时器中断
  351.     EA = 1;
  352. }

  353. void num2str(unsigned int dd)                        //将两位数字拆分为10位和个位的数字,放入字符函数的数组地址中,分别用字符输出函数显示输出
  354. {        unsigned int a,b;
  355.         a=dd/10%10;                                //两位整数的10位
  356.         b=dd%10;                                //两位整数的个位
  357.         //Eng_Code[]是英文大字符的名称数组16进制编号,Eng_Dot[]是英文大字符的图形点阵地址数组
  358.         putcharD(a+0X30);
  359.         //exdelay();
  360.         putcharD(b+0X30);
  361.         exdelay();
  362. }
  363. //-------------------------------------------------------------------------------

  364. void main(void)
  365. {
  366.         P42 = 0;
  367.         RST = 0;
  368.         exdelay();
  369.         RST = 1;
  370.         time0_init();
  371.     while(1)
  372.     {
  373.                 lcdreset();                     //初始化液晶显示控制器
  374.         exsample();                     //演示程序
  375.     }
  376. }
  377. void exsample(void)                     //演示程序
  378. {
  379. //0.演示前的准备,将LCD液晶显示全部清空
  380.     CharImageReverse=0;                 //反显关闭
  381.     lcdfill(0);                         //清屏

  382. //1.图片测试: 在(8,16)位置显示32点阵SUNMAN图标
  383.     // XPOS=8;
  384.     // YPOS=8;
  385.     // putimage(Img_sunman_32);            //写数据到当前LCDRAM地址中
  386.     // exdelay();                          //延时约600mS

  387. //3.字符串测试: 在(40,32)位置显示"太阳人电子"字符串.
  388.     XPOS=10;
  389.     YPOS=0;
  390.     putstr("距中考还有");
  391. //   exdelay();                          //延时约600mS
  392.         
  393. //2.字符串测试: 在(26,32)位置显示变化的数字day,在(58,32)位置显示"天"字符串.
  394.     XPOS=26;
  395.     YPOS=32;
  396.         num2str(day);                                //字符串变量一般都是数组,如何用指针变量定位码表中的字符?
  397.         XPOS=58;
  398.     YPOS=32;
  399.     putstrD("天");
  400.     exdelay();                          //延时约600mS
  401.         exdelay();exdelay();
  402. //4.反显测试: 在(40,32)位置反显"太阳人电子"字符串.
  403.     XPOS=26;
  404.     YPOS=32;
  405.     CharImageReverse=1;
  406.     num2str(day);                                
  407.         XPOS=58;
  408.     YPOS=32;
  409.     putstrD("天");
  410.     CharImageReverse=0;
  411.     exdelay();                          //延时约600mS
  412.         exdelay();

  413. }
  414. void exdelay(void)                      //演示延时子程序
  415. { unsigned char i,j,k;                  //延时约600mS
  416.   for(i=0;i<60;i++)
  417.     for(j=0;j<100;j++)
  418.       for(k=0;k<200;k++);
  419. }

  420. //-------------------------------------------------------------------------------
  421. //以下putchar为字符对象的基本子程序,putstr为字符对象的扩充子程序,getchinesecodepos,
  422. //getenglishcodepos为字符对象的辅助子程序.
  423. //-------------------------------------------------------------------------------
  424. //子程序名称:void putchar(unsigned int c).
  425. //功能:在(XPOS,YPOS)位置写单个字符点阵,若c>128 表示为中文字符,否则为西文字符
  426. //修改日期:2009.8.18
  427. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  428. //-------------------------------------------------------------------------------
  429. void putchar(unsigned int c)            //定位写字符子程序
  430. {   if(c>128)
  431.         putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,getchinesecodepos(c));
  432.     else
  433.         putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,getenglishcodepos(c));
  434. }
  435. //-------------------------------------------------------------------------------
  436. void putcharD(unsigned int d)            //定位写大字符子程序
  437. {   if(d>128)
  438.         putsizeimage(CHN_SIZE,CHN_SIZE,getChn_Codepos(d));
  439.     else
  440.         putsizeimage(ENG_SIZE,CHN_SIZE,getEng_Codepos(d));
  441. }
  442. //-------------------------------------------------------------------------------
  443. //子程序名称:void putstr(unsigned char code *s).
  444. //功能:写字符串点阵,若*s=0 表示字符串结束.
  445. //修改日期:2009.8.18
  446. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  447. //-------------------------------------------------------------------------------
  448. void putstr(unsigned char code *s)      //显示字符串子程序,字符码为0时退出
  449. {   unsigned int c;
  450.     while(1)
  451.     {   c=*s;
  452.         s++;
  453.         if(c==0) break;
  454.         if(c<128)
  455.             putchar(c);
  456.         else
  457.         {   putchar(c*256+*s);
  458.             s++;
  459.         }
  460.     }
  461. }
  462. //-------------------------------------------------------------------------------
  463. void putstrD(unsigned char code *t)      //显示大字符串子程序,字符码为0时退出
  464. {   unsigned int c;
  465.     while(1)
  466.     {   c=*t;
  467.         t++;
  468.         if(c==0) break;
  469.         if(c<128)
  470.             putcharD(c);
  471.         else
  472.         {   putcharD(c*256+*t);
  473.             t++;
  474.         }
  475.     }
  476. }
  477. //-------------------------------------------------------------------------------
  478. //子程序名称:unsigned char code *getchinesecodepos(unsigned char ac).
  479. //功能:根据当前中文字符码查表后计算得到当前中文字符码的字库点阵位置.
  480. //修改日期:2009.8.18
  481. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  482. //-------------------------------------------------------------------------------
  483. unsigned char code *getchinesecodepos(unsigned int ac)
  484. {   unsigned int min,max,mid,midc;
  485.     min=0;
  486.     max=CHINESECHARNUMBER-1;
  487.     while(1)
  488.     {   if(max-min<2)
  489.         {   if(ChineseCode[min]==ac)
  490.                 mid=min;
  491.             else if(ChineseCode[max]==ac)
  492.                 mid=max;
  493.             else
  494.                 mid=0;
  495.             break;
  496.         }
  497.         mid=(max+min)/2;
  498.         midc=ChineseCode[mid];
  499.         if(midc==ac)
  500.             break;
  501.         else if(midc>ac)
  502.             max=mid-1;
  503.         else
  504.             min=mid+1;
  505.     }
  506.     return ChineseCharDot+mid*CHINESECHARDOTSIZE;
  507. }
  508. //-------------------------------------------------------------------------------
  509. //-------------------------------------------------------------------------------
  510. unsigned char code *getChn_Codepos(unsigned int ad)  //中文大字符
  511. {   unsigned int min,max,mid,midc;
  512.     min=0;
  513.     max=CHN_NUMBER-1;
  514.     while(1)
  515.     {   if(max-min<2)
  516.         {   if(Chn_Code[min]==ad)
  517.                 mid=min;
  518.             else if(Chn_Code[max]==ad)
  519.                 mid=max;
  520.             else
  521.                 mid=0;
  522.             break;
  523.         }
  524.         mid=(max+min)/2;
  525.         midc=Chn_Code[mid];
  526.         if(midc==ad)
  527.             break;
  528.         else if(midc>ad)
  529.             max=mid-1;
  530.         else
  531.             min=mid+1;
  532.     }
  533.     return Chn_Dot+mid*CHN_DOTSIZE;
  534. }
  535. //-------------------------------------------------------------------------------
  536. //子程序名称:unsigned char code *getenglishcodepos(unsigned char ac).
  537. //功能:根据当前ASCII字符码查表后计算得到当前ASCII字符码的字库点阵位置.
  538. //修改日期:2009.8.18
  539. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  540. //-------------------------------------------------------------------------------
  541. unsigned char code *getenglishcodepos(unsigned char ac)
  542. {   unsigned char min,max,mid,midc;
  543.     min=0;
  544.     max=ENGLISHCHARNUMBER-1;
  545.     while(1)
  546.     {   if(max-min<2)
  547.         {   if(EnglishCode[min]==ac)
  548.                 mid=min;
  549.             else if(EnglishCode[max]==ac)
  550.                 mid=max;
  551.             else
  552.                 mid=0;
  553.             break;
  554.         }
  555.         mid=(max+min)/2;
  556.         midc=EnglishCode[mid];
  557.         if(midc==ac)
  558.             break;
  559.         else if(midc>ac)
  560.             max=mid-1;
  561.         else
  562.             min=mid+1;
  563.     }
  564.     return EnglishCharDot+mid*ENGLISHCHARDOTSIZE;
  565. }
  566. //-------------------------------------------------------------------------------
  567. //-------------------------------------------------------------------------------
  568. unsigned char code *getEng_Codepos(unsigned char ad)   //英文大字符
  569. {   unsigned char min,max,mid,midc;
  570.     min=0;
  571.     max=ENG_NUMBER-1;
  572.     while(1)
  573.     {   if(max-min<2)
  574.         {   if(Eng_Code[min]==ad)
  575.                 mid=min;
  576.             else if(Eng_Code[max]==ad)
  577.                 mid=max;
  578.             else
  579.                 mid=0;
  580.             break;
  581.         }
  582.         mid=(max+min)/2;
  583.         midc=Eng_Code[mid];
  584.         if(midc==ad)
  585.             break;
  586.         else if(midc>ad)
  587.             max=mid-1;
  588.         else
  589.             min=mid+1;
  590.     }
  591.     return Eng_Dot+mid*ENG_DOTSIZE;
  592. }
  593. //-------------------------------------------------------------------------------
  594. //以下putsizeimage为图形对象的基本子程序,putimage为图形对象的扩充子程序
  595. //-------------------------------------------------------------------------------
  596. //子程序名称:void putsizeimage(unsigned char XSIZE,unsigned YSIZE,
  597. //                             unsigned char code *s)
  598. //功能:在(XPOS,YPOS)位置绘制XSIZE列及YISZE行点阵的图形*S.
  599. //修改日期:2009.8.31
  600. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  601. //-------------------------------------------------------------------------------
  602. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
  603. {
  604.    unsigned char k,lx,ly,a1,a2,y,Lcd_Mask;
  605.    k=YPOS&0x7;
  606.    YSIZE+=k;
  607.    y=YPOS;
  608.    s--;
  609.    for(lx=0;lx<XSIZE;lx++,XPOS++)
  610.    {  for(YPOS=y,ly=k;ly<YSIZE;)
  611.       {  unsigned char p;
  612.          a1=*s;
  613.          s++;
  614.          a2=*s;
  615.          if(CharImageReverse)
  616.          {   a1=~a1;
  617.              a2=~a2;
  618.          }
  619.          for(p=0;p<k;p++)
  620.          {  a2>>=1;
  621.             if((a1&0x1)==1)
  622.                a2+=0x80;
  623.             a1>>=1;
  624.          }
  625.          if((k==0) && (YSIZE<ly+8))
  626.          {   lcdpos();
  627.              ly+=8;
  628.              YPOS+=8;
  629.          }
  630.          else
  631.          {   lcdpos();

  632.              lcdpos();
  633.              ly+=8;
  634.              YPOS+=8;
  635.              Lcd_Mask=0xff;
  636.              p=YSIZE&0x7;
  637.              while(p>0)
  638.              {   Lcd_Mask>>=1;
  639.                  YPOS--;
  640.                  p--;
  641.              }
  642.              p=0xff;
  643.              while(YSIZE<ly)
  644.              {   ly--;
  645.                  YPOS--;
  646.                  p<<=1;
  647.              }
  648.              Lcd_Mask&=p;
  649.              a2&=Lcd_Mask;
  650.              a2|=a1&(~Lcd_Mask);
  651.          }
  652.          lcdwd(a2);
  653.       }
  654.       if((k!=0) && (YSIZE&0x7 != 0) && (k >= YSIZE&0x7)) s--;
  655.    }
  656.    YPOS=y;
  657. }
  658. //-------------------------------------------------------------------------------
  659. //子程序名称:void putimage(unsigned char code *s).
  660. //功能:在(XPOS,YPOS)位置绘制XSIZE[*s]列及YISZE[*(s+1)]行点阵的图形[*(s+2)].
  661. //修改日期:2009.8.18
  662. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  663. //-------------------------------------------------------------------------------
  664. void putimage(unsigned char code *s)    //显示图形子程序
  665. {
  666.     unsigned char XSIZE,YSIZE;
  667.     XSIZE=*s;
  668.     s++;
  669.     YSIZE=*s;
  670.     s++;
  671.     putsizeimage(XSIZE,YSIZE,s);
  672. }
  673. //-------------------------------------------------------------------------------

  674. //-------------------------------------------------------------------------------
  675. //以下lcdfill,lcdpos,lcdreset为KS0108B型硬件接口的12864液晶显示模块的基本子程序
  676. //-------------------------------------------------------------------------------
  677. //子程序名称:void lcdfill(unsigned char d).
  678. //功能:整屏显示d表示的字节数据.
  679. //修改日期:2009.08.31
  680. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  681. //-------------------------------------------------------------------------------
  682. void lcdfill(unsigned char d)           //整屏显示d代表的字节数据子程序
  683. {  
  684.         unsigned char j;
  685.     for(YPOS=0;YPOS<64;YPOS+=8)         //8页
  686.     {   XPOS=0;
  687.         lcdpos();
  688.         for(j=0;j<64;j++)              //64列
  689.             lcdwd1(d);                 //送图形数据
  690.         XPOS=64;
  691.         lcdpos();
  692.         for(j=0;j<64;j++)              //64列
  693.             lcdwd2(d);                 //送图形数据
  694.     }
  695.     XPOS=0;
  696.     YPOS=0;
  697. }
  698. //-------------------------------------------------------------------------------
  699. //子程序名称:void lcdpos(void).
  700. //功能:设置坐标点(XPOS,YPOS)位置对应的内部RAM地址.
  701. //修改日期:2009.08.31
  702. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  703. //-------------------------------------------------------------------------------
  704. void lcdpos(void)                       //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
  705. {  //unsigned char Column;
  706.    if(XPOS<64)
  707.    {
  708.               lcdwc1(0xB8+((YPOS/8)&0x07));     //页地址设置
  709.        lcdwc1(0x40+XPOS);               //列地址设置
  710.    }
  711.    else
  712.    {   lcdwc2(0xB8+((YPOS/8)&0x07));     //页地址设置
  713.        lcdwc2(0x40+(XPOS&0x3F));        //列地址设置
  714.    }
  715. }
  716. //-------------------------------------------------------------------------------
  717. //子程序名称:void lcdreset(void)
  718. //功能:液晶显示控制器初始化
  719. //修改日期:2009.08.31
  720. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  721. //-------------------------------------------------------------------------------
  722. void lcdreset(void)                     //液晶显示控制器初始化子程序
  723. {
  724.     lcdwc1(0xC0);                       //设置显示初始行
  725.     lcdwc2(0xC0);                       //设置显示初始行
  726.     lcdwc1(0x3F);                       //开显示
  727.     lcdwc2(0x3F);                       //开显示

  728. }

  729. //-------------------------------------------------------------------------------
  730. //子程序名称:void lcdwd(unsigned char d).
  731. //功能:向液晶显示控制器写图形数据.
  732. //修改日期:2009.08.31
  733. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  734. //-------------------------------------------------------------------------------
  735. void lcdwd(unsigned char d)
  736. {
  737.     if(XPOS<64)
  738.         lcdwd1(d);
  739.     else
  740.         lcdwd2(d);
  741. }
  742. //-------------------------------------------------------------------------------
  743. //子程序名称:void lcdwd1(unsigned char d).
  744. //功能:向液晶显示控制器1写图形数据.
  745. //修改日期:2009.08.31
  746. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  747. //-------------------------------------------------------------------------------
  748. void lcdwd1(unsigned char d)
  749. {  
  750.         lcdwaitidle1();
  751.     Send_byte_over(d);//通过74HC595 串行输入数据,并行输出到LCD的8位数据口
  752.     RS  = 1;
  753.     RW  =0;
  754.     CS1 =1;
  755.     CS2 =0;
  756.     EN  =1;
  757.     _nop_();
  758.     EN  =0;
  759.     CS1 =0;
  760. }
  761. //-------------------------------------------------------------------------------
  762. //子程序名称:void lcdwd2(unsigned char d).
  763. //功能:向液晶显示控制器2写图形数据.
  764. //修改日期:2009.08.31
  765. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  766. //-------------------------------------------------------------------------------
  767. void lcdwd2(unsigned char d)
  768. {  
  769.         lcdwaitidle2();
  770.     Send_byte_over(d); //通过74HC595 串行输入数据,并行输出到LCD的8位数据口
  771.     RS  = 1;
  772.     RW        = 0;
  773.     CS1        = 0;
  774.     CS2        = 1;
  775.     EN        = 1;
  776.     _nop_();
  777.     EN  = 0;
  778.     CS2        = 0;
  779. }

  780. //-------------------------------------------------------------------------------
  781. //子程序名称:lcdwc1(unsigned char c).
  782. //功能:向液晶显示控制器1送指令.
  783. //修改日期:2009.10.30
  784. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  785. //-------------------------------------------------------------------------------
  786. void lcdwc1(unsigned char c)            //向液晶显示控制器1送指令
  787. {
  788.     lcdwaitidle1();
  789.     Send_byte_over(c);//通过74HC595 串行输入数据,并行输出到LCD的8位数据口
  790.     RS        = 0;
  791.     RW        = 0;
  792.     CS1        = 1;
  793.     CS2        = 0;
  794.     EN        = 1;
  795.     _nop_();
  796.     EN        = 0;
  797.     CS1        = 0;
  798. }
  799. //-------------------------------------------------------------------------------
  800. //子程序名称:lcdwc2(unsigned char c).
  801. //功能:向液晶显示控制器2送指令.
  802. //修改日期:2009.10.30
  803. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  804. //-------------------------------------------------------------------------------
  805. void lcdwc2(unsigned char c)            //向液晶显示控制器2送指令
  806. {
  807.     lcdwaitidle2();
  808.     Send_byte_over(c);        //通过74HC595 串行输入数据,并行输出到LCD的8位数据口
  809.     RS        = 0;
  810.     RW        = 0;
  811.     CS1        = 0;
  812.     CS2        = 1;
  813.     EN        = 1;
  814.     _nop_();
  815.     EN        = 0;
  816.     CS2        = 0;
  817. }
  818. //-------------------------------------------------------------------------------
  819. //子程序名称:voidlcdwaitidle1(void).
  820. //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
  821. //修改日期:2009.10.30
  822. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  823. //-------------------------------------------------------------------------------
  824. void lcdwaitidle1(void)                 //控制器1忙检测子程序
  825. {   
  826.     RS        = 0;
  827.     RW        = 1;
  828.     CS1        = 1;
  829.     CS2        = 0;
  830.     EN        = 1;
  831.         DelayMs(1);
  832.     EN        = 0;
  833.     CS1        = 0;
  834. }
  835. //-------------------------------------------------------------------------------
  836. //子程序名称:voidlcdwaitidle2(void).
  837. //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
  838. //修改日期:2009.10.30
  839. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  840. //-------------------------------------------------------------------------------
  841. void lcdwaitidle2(void)                 //控制器2忙检测子程序
  842. {  
  843.     RS        = 0;
  844.     RW        = 1;
  845.     CS1        = 0;
  846.     CS2        = 1;
  847.     EN        = 1;
  848.         DelayMs(1);        //查忙由延时替代
  849.     EN        = 0;
  850.     CS2        = 0;
  851. }

  852. /**********************************************/
  853. void Send_595(unsigned char dat)        //发送一个字节
  854. {               
  855.         unsigned char        i;
  856.         for(i=0; i<8; i++)
  857.         {
  858.                 if(dat & 0x80)        P_HC595_SER = 1;
  859.                 else                        P_HC595_SER = 0;
  860.                 P_HC595_SRCLK = 1;
  861.                 P_HC595_SRCLK = 0;
  862.                 dat = dat << 1;
  863.         }
  864. }

  865. void Send_byte_over(unsigned char sda)
  866. {
  867.         Send_595(sda);
  868.         P_HC595_RCLK = 1;
  869.         P_HC595_RCLK = 0;
  870. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表