搜索
bottom↓
回复: 1

求助:关于LCD12864万年历的c程序

[复制链接]

出0入0汤圆

发表于 2013-3-31 00:34:41 | 显示全部楼层 |阅读模式
原理图



代码:
/************************************mian.c********************************
  1. /********************************************************************
  2. 文件名:万年历.c
  3. 晶振频率:12MHz
  4. 芯片:STC89C52
  5. *********************************************************************/
  6. #include "reg52.h"
  7. #include "intrins.h"
  8. #include "string.h"
  9. #include "LCD_12864.c"
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. /*extern void LCD_Initialize(void);
  13. extern void Display_A_Char_8X16(uchar P,uchar L,uchar *M);
  14. extern void Display_A_WORD(uchar P,uchar L,uchar *M);
  15. //在调整日期时间时,用该位决定是否反白显示
  16. extern bit Reverse_Display=0;
  17. */
  18. sbit SDA=P1^0;  //DS1302数据线
  19. sbit CLK=P1^1;  //DS1302时钟线
  20. sbit RST=P1^2;  //DS1302复位线
  21. sbit k1=P3^4;  //选择
  22. sbit k2=P3^5;  //加
  23. sbit k3=P3^6;  //减
  24. sbit k4=P3^7;  //确定
  25. uchar tCount=0;
  26. //一年中每个月的天数,2月的天数由年份决定
  27. uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
  28. //所读取的日期时间
  29. uchar DateTime[7];
  30. //当前调整的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)
  31. //5对应星期,星期调节由年月日调整自动完成
  32. char Adjust_Index=-1;
  33. //水平与垂直偏移
  34. uchar H_Offset=10,V_Page_Offset=0;
  35. //年月日,星期,时分秒汉字点阵(16*16)-------------------------------
  36. uchar code DATE_TIME_WORDS[]={
  37. /*--  文字:  年  --*/
  38. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  39. 0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00,
  40. 0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
  41. /*--  文字:  月  --*/
  42. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  43. 0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
  44. 0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,
  45. /*--  文字:  日  --*/
  46. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  47. 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
  48. 0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
  49. /*--  文字:  星  --*/
  50. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  51. 0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,
  52. 0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,
  53. /*--  文字:  期  --*/
  54. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  55. 0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
  56. 0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00,
  57. /*--  文字:  时  --*/
  58. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  59. 0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
  60. 0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00,
  61. /*--  文字:  分  --*/
  62. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  63. 0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x40,0x80,0x00,
  64. 0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
  65. /*--  文字:  秒  --*/
  66. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  67. 0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0xC0,0x38,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
  68. 0x08,0x06,0x01,0xFF,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0C,0x03,0x00,0x00,
  69. };
  70. //星期几的汉字点阵(16*16)----------------------------------
  71. uchar code WEEDDAY_WORDS[]={
  72. /*--  文字:  日  --*/
  73. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  74. 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
  75. 0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
  76. /*--  文字:  一  --*/
  77. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  78. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
  79. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  80. /*--  文字:  二  --*/
  81. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  82. 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
  83. 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
  84. /*--  文字:  三  --*/
  85. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  86. 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
  87. 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  88. /*--  文字:  四  --*/
  89. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  90. 0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
  91. 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,
  92. /*--  文字:  五  --*/
  93. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  94. 0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
  95. 0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,
  96. /*--  文字:  六  --*/
  97. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  98. 0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  99. 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,
  100. };
  101. //半角数字点阵(8*16)----------------------------------------------------
  102. uchar code DIGITS[]={
  103. /*--  文字:  0  --*/
  104. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  105. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
  106. /*--  文字:  1  --*/
  107. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  108. 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
  109. /*--  文字:  2  --*/
  110. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  111. 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
  112. /*--  文字:  3  --*/
  113. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  114. 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
  115. /*--  文字:  4  --*/
  116. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  117. 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
  118. /*--  文字:  5  --*/
  119. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  120. 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
  121. /*--  文字:  6  --*/
  122. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  123. 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
  124. /*--  文字:  7  --*/
  125. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  126. 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
  127. /*--  文字:  8  --*/
  128. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  129. 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
  130. /*--  文字:  9  --*/
  131. /*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
  132. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
  133. };


  134. //向DS1302写入一字节
  135. void Write_A_Byte_TO_DS1302(uchar x)
  136. {        uchar i;
  137.         for(i=0;i<8;i++)
  138.         {        SDA=x&1; CLK=1; CLK=0; x>>=1;
  139.         }
  140. }
  141. //从DS1302读取一字节
  142. uchar Get_A_Byte_FROM_DS1302(void)
  143. {        uchar i,b,t;
  144.         for(i=0;i<8;i++)
  145.         {        b>>=1; t=SDA; b|=t<<7; CLK=1; CLK=0;
  146.         }
  147.         //BCD码转换
  148.         return(b/16*10+b%16);
  149. }
  150. //从DS1302指定位置读数据
  151. uchar Read_Data(uchar addr)
  152. {        uchar dat;
  153.         RST=0; CLK=0; RST=1;
  154.         Write_A_Byte_TO_DS1302(addr);
  155.         dat=Get_A_Byte_FROM_DS1302();
  156.         CLK=1; RST=0;
  157.         return(dat);
  158. }
  159. //向DS1302某地址写入数据
  160. void Write_DS1302(uchar addr,uchar dat)
  161. {        CLK=0; RST=1;
  162.         Write_A_Byte_TO_DS1302(addr);
  163.         Write_A_Byte_TO_DS1302(dat);
  164.         CLK=0; RST=0;
  165. }



  166. //设置时间
  167. void SET_DS1302(void)
  168. {        uchar i;
  169.         Write_DS1302(0x8e,0x00);
  170.         //秒分时日月年依次写入
  171.         for(i=0;i<7;i++)
  172.         {        //秒的起始地址1000 0000(0x80)
  173.                 //后续依次是分,时,月,周,年,写入地址每次递增2
  174.                 Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));
  175.         }
  176.         Write_DS1302(0x8e,0x80);
  177. }
  178. //读取当前日期时间
  179. void GetTime(void)
  180. {        uchar i;
  181.         for(i=0;i<7;i++)
  182.         {        DateTime[i]=Read_Data(0x81+2*i);
  183.         }
  184. }


  185. //半断是否为闰年
  186. uchar isLeapYear(uint y)
  187. {        return((y%4==0&&y%100!=0)||(y%400==0));
  188. }
  189. //--------------------------------------------
  190. //求自2000.1.1开始的任何一天是星期几
  191. //函数没有通过,求出总天数后在求出星期几
  192. //因为求总天数可能会月出uint的范围
  193. //--------------------------------------------
  194. void RefreshWeekDay(void)
  195. {        uint i,d,w=5;  //已知1999.12.31是周五
  196.         for(i=2000;i<2000+DateTime[6];i++)
  197.         {        d=isLeapYear(i)?366:365;
  198.                 w=(w+d)%7;
  199.         }
  200.         d=0;
  201.         for(i=1;i<DateTime[4];i++)d+=MonthsDays[i];
  202.         d+=DateTime[3];
  203.         //保存星期,0~6表示星期日,星期一,二,、、、六,为了与DS1302的星期格式匹配,返回值需要加1
  204.         DateTime[5]=(w+d)%7+1;
  205. }


  206. //年月日时分秒++/--
  207. void DateTime_Adjust(char x)
  208. {        switch(Adjust_Index)
  209.         {        case 6:  //年00-99
  210.                         if(x==1&&DateTime[6]<99)DateTime[6]++;
  211.                         if(x==-1&&DateTime[6]>0)DateTime[6]--;
  212.                         //获取2月天数
  213.                         MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
  214.                         //如果年份变化后当前月份的天数大于上限则设为上限
  215.                         if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays[DateTime[4]];
  216.                         RefreshWeekDay();  //刷新星期
  217.                         break;
  218.                 case 4:   //月01-12
  219.                         if(x==1&&DateTime[4]<12)DateTime[4]++;
  220.                         if(x==-1&&DateTime[4]>1)DateTime[4]--;
  221.                         //获取2月份天数
  222.                         MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
  223.                         //如果月份变化后当前月份的天数大于上限则设为上限
  224.                         if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays[DateTime[4]];
  225.                         RefreshWeekDay();  //刷新星期
  226.                         break;
  227.                 case 3:  //日00-28/29/30/31;调节之前首先根据年份得出该年中2月的天数
  228.                         MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
  229.                         //根据当前月份决定调节日期的上限
  230.                         if(x==1&&DateTime[3]<MonthsDays[DateTime[4]])DateTime[3]++;
  231.                         if(x==-1&&DateTime[3]>1)DateTime[3]--;
  232.                         RefreshWeekDay();  //刷新星期
  233.                         break;
  234.                 case 2:  //时
  235.                         if(x==1&&DateTime[2]<23)DateTime[2]++;
  236.                         if(x==-1&&DateTime[3]>1)DateTime[2]--;
  237.                         break;
  238.                 case 1:  //分
  239.                         if(x==1&&DateTime[1]<59)DateTime[1]++;
  240.                         if(x==-1&&DateTime[1]>1)DateTime[1]--;
  241.                         break;
  242.                 case 0:  //秒
  243.                         if(x==1&&DateTime[0]<59)DateTime[0]++;
  244.                         if(x==-1&&DateTime[0]>1)DateTime[0]--;
  245.         }
  246. }


  247. //定时器0每秒刷新LCD显示
  248. void T0_INT(void) interrupt 1
  249. {        TH0=-50000/256;
  250.         TL0=-50000%256;
  251.         if(++tCount!=2)return;
  252.         tCount=0;
  253.         if(Adjust_Index==-1)GetTime();        //如果未执行调整操作则正常读取当前时间
  254.         //年后两位
  255.         Reverse_Display=Adjust_Index==6;   /*等同于
  256.         {        if(Adjust_Index==6)Reverse_Display=1;
  257.                 else Reverse_Display=0;                }        */
  258.         Display_A_Char_8X16(V_Page_Offset,16+H_Offset,DIGITS+DateTime[6]/10*16);
  259.         Display_A_Char_8X16(V_Page_Offset,24+H_Offset,DIGITS+DateTime[6]%10*16);
  260.         //月
  261.         Reverse_Display=Adjust_Index==4;
  262.         Display_A_Char_8X16(V_Page_Offset,48+H_Offset,DIGITS+DateTime[4]/10*16);
  263.         Display_A_Char_8X16(V_Page_Offset,56+H_Offset,DIGITS+DateTime[4]%10*16);
  264.         //日
  265.         Reverse_Display=Adjust_Index==3;
  266.         Display_A_Char_8X16(V_Page_Offset,80+H_Offset,DIGITS+DateTime[3]/10*16);
  267.         Display_A_Char_8X16(V_Page_Offset,88+H_Offset,DIGITS+DateTime[3]%10*16);
  268.         //星期
  269.         Reverse_Display=Adjust_Index==5;
  270.         Display_A_WORD(V_Page_Offset+2,96+H_Offset,WEEDDAY_WORDS+(DateTime[5]-1)*32);
  271.         //时
  272.         Reverse_Display=Adjust_Index==2;
  273.         Display_A_Char_8X16(V_Page_Offset+5,16+H_Offset,DIGITS+DateTime[2]/10*16);
  274.         Display_A_Char_8X16(V_Page_Offset+5,24+H_Offset,DIGITS+DateTime[2]%10*16);
  275.         //分
  276.         Reverse_Display=Adjust_Index==1;
  277.         Display_A_Char_8X16(V_Page_Offset+5,48+H_Offset,DIGITS+DateTime[1]/10*16);
  278.         Display_A_Char_8X16(V_Page_Offset+5,56+H_Offset,DIGITS+DateTime[1]%10*16);
  279.         //秒
  280.         Reverse_Display=Adjust_Index==0;
  281.         Display_A_Char_8X16(V_Page_Offset+5,80+H_Offset,DIGITS+DateTime[0]/10*16);
  282.         Display_A_Char_8X16(V_Page_Offset+5,88+H_Offset,DIGITS+DateTime[0]%10*16);
  283. }


  284. //键盘中断(INT0)
  285. void EX_INT0(void) interrupt 0
  286. {        if(k1==0)  //选择调整对象
  287.         {        if(Adjust_Index==-1||Adjust_Index==0)Adjust_Index=7;
  288.                 Adjust_Index--;
  289.                 if(Adjust_Index==5)Adjust_Index=4;  //跳过对星期的调整
  290.         }
  291.         else if(k2==0)DateTime_Adjust(1);  //加
  292.         else if(k3==0)DateTime_Adjust(-1);  //减
  293.         else if(k4==0)  //确定
  294.         {        SET_DS1302();  //将调整后的时间写入DS1302
  295.                 Adjust_Index=-1;  //操作索引重设为-1,时间继续正常显示
  296.         }
  297. }


  298. //主程序
  299. void main()
  300. {        //液晶初始化
  301.         LCD_Initialize();
  302.         //显示年的固定前两位
  303.         Display_A_Char_8X16(V_Page_Offset,0+H_Offset,DIGITS+2*16);
  304.         Display_A_Char_8X16(V_Page_Offset,8+H_Offset,DIGITS);
  305.         //显示固定汉字:年月日,星期,时分秒
  306.         Display_A_WORD(V_Page_Offset,32+H_Offset,DATE_TIME_WORDS+0*32);
  307.         Display_A_WORD(V_Page_Offset,64+H_Offset,DATE_TIME_WORDS+1*32);
  308.         Display_A_WORD(V_Page_Offset,96+H_Offset,DATE_TIME_WORDS+2*32);
  309.         Display_A_WORD(V_Page_Offset+2,64+H_Offset,DATE_TIME_WORDS+3*32);
  310.         Display_A_WORD(V_Page_Offset+2,80+H_Offset,DATE_TIME_WORDS+4*32);
  311.         Display_A_WORD(V_Page_Offset+5,32+H_Offset,DATE_TIME_WORDS+5*32);
  312.         Display_A_WORD(V_Page_Offset+5,64+H_Offset,DATE_TIME_WORDS+6*32);
  313.         Display_A_WORD(V_Page_Offset+5,96+H_Offset,DATE_TIME_WORDS+7*32);
  314.         //允许INT0,T0中断
  315.         IE=0x83;
  316.         IP=0x01;
  317.         IT0=0x01;
  318.         TH0=-50000/256;
  319.         TL0=-50000%256;
  320.         TR0=1;
  321.         while(1);
  322. }
复制代码
/******************************LCD12864.c*******************************************/
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define LCD_DB_PORT P0  //液晶DB0~DB7
  6. #define LCD_START_ROW 0xc0  //起始行
  7. #define LCD_PAGE 0xb8  //页指令
  8. #define LCD_COL 0x40  //列指令
  9. //液晶引脚定义
  10. sbit LCD_DI=P2^0;
  11. sbit LCD_RW=P2^1;
  12. sbit LCD_E=P2^2;
  13. sbit LCD_CS1=P2^3;
  14. sbit LCD_CS2=P2^4;
  15. sbit LCD_RST=P2^5;

  16. bit Reverse_Display=0;
  17. //检查LCD是否忙
  18. bit LCD_Check_Busy(void)
  19. {        LCD_DB_PORT=0xff;
  20.         LCD_RW=1; _nop_(); LCD_DI=0;
  21.         LCD_E=1; _nop_(); LCD_E=0;
  22.         return(bit)(P0&0x80);
  23. }
  24. //向LCD发送命令
  25. void LCD_Write_Command(uchar c)
  26. {        while(LCD_Check_Busy());
  27.         LCD_DB_PORT=0xff; LCD_RW=0; _nop_(); LCD_DI=0;
  28.         LCD_DB_PORT=c; LCD_E=1; _nop_(); LCD_E=0;
  29. }
  30. //向LCD发送数据
  31. void LCD_Write_Data(uchar d)
  32. {        while(LCD_Check_Busy());
  33.         LCD_DB_PORT=0xff;
  34.         LCD_RW=0;_nop_();LCD_DI=1;
  35.         //根据Reverse_Display决定是否反相显示
  36.         if(!Reverse_Display)LCD_DB_PORT=d;else LCD_DB_PORT=~d;
  37.         LCD_E=1;_nop_();LCD_E=0;
  38. }
  39. //初始化LCD
  40. void LCD_Initialize(void)
  41. {        LCD_CS1=1;LCD_CS2=1;
  42.         LCD_Write_Command(0x38);
  43.         LCD_Write_Command(0x0f);
  44.         LCD_Write_Command(0x01);
  45.         LCD_Write_Command(0x06);
  46.         LCD_Write_Command(LCD_START_ROW);
  47. }
  48. //通用显示函数
  49. //从第P页第L列开始显示W个字节数据,数据在r所指向的缓冲
  50. //每字节8位是垂直显示的,高位在下,低位在上
  51. //每个8*128的矩形区域为一页
  52. //整个LCD右由64*64的左半屏和64*64的右半屏构成
  53. void Common_Show(uchar P,uchar L,uchar W,uchar *r)
  54. {        uchar i;
  55.         if(L<64)  //显示在左半屏或左右半屏
  56.         {        LCD_CS1=1;LCD_CS2=0;
  57.                 LCD_Write_Command(LCD_PAGE+P);
  58.                 LCD_Write_Command(LCD_COL+L);
  59.                 if(L+W<64)  //全部显示在左右半屏
  60.                 {        for(i=0;i<W;i++)LCD_Write_Data(r[i]);
  61.                 }
  62.                 else   //如果越界则跨左右半屏显示
  63.                 {        for(i=0;i<64-L;i++)LCD_Write_Data(r[i]);  //左半屏显示
  64.                         LCD_CS1=0;LCD_CS2=1;  //右半屏显示
  65.                         LCD_Write_Command(LCD_PAGE+P);
  66.                         LCD_Write_Command(LCD_COL);
  67.                         for(i=64;i<W;i++)LCD_Write_Data(r[i]);
  68.                 }
  69.         }
  70.         else //全部显示在右半屏
  71.         {        LCD_CS1=0;LCD_CS2=1;
  72.                 LCD_Write_Command(LCD_PAGE+P);
  73.                 LCD_Write_Command(LCD_COL+L-61);
  74.                 for(i=0;i<W;i++)LCD_Write_Data(r[i]);
  75.         }
  76. }
  77. //显示8*16点阵字符
  78. void Display_A_Char_8X16(uchar P,uchar L,uchar *M)
  79. {        Common_Show(P,L,8,M);
  80.         Common_Show(P+1,L,8,M+8);
  81. }
  82. //显示一个16*16点阵汉字
  83. void Display_A_WORD(uchar P,uchar L,uchar *M)
  84. {        Common_Show(P,L,16,M);  //显示汉字上半部分
  85.         Common_Show(P+1,L,16,M+16);
  86. }
复制代码
编译无法通过,error and warning


附件






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-3-31 11:16:32 | 显示全部楼层
自顶一下,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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