1. #include <STC15F2K60S2.H>
2. #include <intrins.h>
3.
4. /*7段數(shù)碼段對應(yīng)的8Bit順序依次為bit7~bit0:abcx_fged
5. --01--
6. | |
7. 10 02 08
8. | --20-- |
9. 40 04 08
10. | |
11. --80--
12. */
13.
14. /*--------------------------------------------------------------
15. LCD操作相關(guān)的宏定義和函數(shù)聲明
16. ----------------------------------------------------------------*/
17. #define ComMode 0x52 //4COM,1/3bias 偏壓比 1000 0101 0010
18. //#define ComMode 0x50 //4COM,1/2bias 1000 0101 0000
19. #define RCosc 0x30 //內(nèi)部RC振蕩器(上電默認)1000 0011 0000
20. #define LCD_on 0x06 //打開LCD顯示 偏壓發(fā)生器1000 0000 0110
21. #define LCD_off 0x04 //關(guān)閉LCD顯示(上電默認)
22. #define Sys_en 0x02 //系統(tǒng)振蕩器開 1000 0000 0010
23. #define Ctrl_cmd 0x80 //寫控制命令 1000
24. #define Data_cmd 0xa0 //寫數(shù)據(jù)命令 1010
25.
26. sbit DIPIN =P3^7; //LCD液晶屏DI引腳
27. sbit CLKPIN =P3^6; //LCD液晶屏CLK引腳
28. sbit CSPIN =P3^5; //LCD液晶屏CS引腳
29.
30. //SMS0707B LCD Drive code
31. //Write bit data 寫位數(shù)據(jù)
32. void SendBit_1621(unsigned char sdata,unsigned char cnt)
33. //sdata 的高cnt 位寫入HT1621,高位在前
34. {
35. unsigned char i;
36. for(i=0;i<cnt;i++)
37. {
38. CLKPIN=0;
39. if(sdata&0x80)
40. DIPIN=1;
41. else DIPIN=0;
42. CLKPIN=1;
43. sdata<<=1;
44. }
45. }
46.
47. /*--------------------------------------------------------------------------------------------------------
48. Name: SendCmd(送命令)
49. 寫入標志碼"100"和9位comma命令,由于沒有使用到更改時鐘輸出等命令
50. 為了編程方便直接將command 的最高位寫"0"
51. ----------------------------------------------------------------------------------------------------------*/
52. void SendCmd_1621(unsigned char command)//寫命令
53. { //3位標志碼 + 9位命令,共12位
54. CSPIN=0; //執(zhí)行一個下降沿
55. SendBit_1621(0x80,4);
56. //寫入標志碼"100"和9位comma命令的最高1位共4位
57. SendBit_1621(command,8);
58. //寫入9位comma命令的后8位,組成1000 xxxx xxxx
59. CSPIN=1; //送數(shù)完成后置高電平
60. }
61.
62. /******-------------------------------------------------------------------------
63. Name: Write_1621(送命令和數(shù)據(jù)程序)
64. 寫入標志碼"101"和6位addr地址碼和8位sdata顯示數(shù)據(jù)。
65. ---------------------------------------------------------------------------*******/
66. void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//寫數(shù)據(jù)
67. {//3位標志碼 + 6位寫數(shù)據(jù)命令 + 8(4)位數(shù)據(jù),共17位
68. addr<<=2;//高6位有效
69. CSPIN=0; //執(zhí)行一個下降沿
70. SendBit_1621(0xa0,3); //寫入標志碼"101" 寫數(shù)據(jù)命令101
71. SendBit_1621(addr,6); //寫入addr 的高6位 寫數(shù)據(jù)命令xxxx xx
72. SendBit_1621(sdata,len); //寫入8/4位 sdata數(shù)據(jù) len=8/4
73. CSPIN=1;//送數(shù)完成后置高電平
74. }
75.
76. /**-------------------------------------------------------------------------
77. Name: Init_1621(初始化1621)
78. -------------------------------------------------------------------------******/
79. void LCD_Init() //初始化
80. { //程序輸入100 0+8=9位命令
81. SendCmd_1621(Sys_en); //Sys_en 0x02 系統(tǒng)振蕩器開 100 0 0000 0010
82. SendCmd_1621(RCosc);
83. //RCosc 0x30 內(nèi)部RC振蕩器(上電默認) 100 0 0011 0000
84. SendCmd_1621(ComMode); //4COM,1/3bias 100 0 0101 0020
85. SendCmd_1621(LCD_on);
86. //LCD_on 0x06 打開LCD顯示 偏壓發(fā)生器100 0 0000 0110
87. }
88.
89. /*-------------------------------------------------------------------------
90. Name: lcdwd1(點亮1621全部Seg)
91. -------------------------------------------------------------------------*/
92. void LCDWD1(void)
93. {
94. unsigned char i;
95. unsigned char addr=9;//5位顯示碼寄存器起始地址0x09
96. for(i=0;i<5;i++)
97. {
98. Write_1621(addr,LCD_Buffer[i+1],8);
99. //addr為地址碼,l_data為數(shù)據(jù),8為8位數(shù)據(jù)
100. addr+=2; //順延2個4位地址碼
101. }
102. }
|