1. #include <STC15F2K60S2.H>
2. #include <intrins.h>
3.
4. /*7段数码段对应的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操作相关的宏定义和函数声明
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 //内部RC振荡器(上电默认)1000 0011 0000
20. #define LCD_on 0x06 //打开LCD显示 偏压发生器1000 0000 0110
21. #define LCD_off 0x04 //关闭LCD显示(上电默认)
22. #define Sys_en 0x02 //系统振荡器开 1000 0000 0010
23. #define Ctrl_cmd 0x80 //写控制命令 1000
24. #define Data_cmd 0xa0 //写数据命令 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 写位数据
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; //执行一个下降沿
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; //送数完成后置高电平
60. }
61.
62. /******-------------------------------------------------------------------------
63. Name: Write_1621(送命令和数据程序)
64. 写入标志码"101"和6位addr地址码和8位sdata显示数据。
65. ---------------------------------------------------------------------------*******/
66. void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//写数据
67. {//3位标志码 + 6位写数据命令 + 8(4)位数据,共17位
68. addr<<=2;//高6位有效
69. CSPIN=0; //执行一个下降沿
70. SendBit_1621(0xa0,3); //写入标志码"101" 写数据命令101
71. SendBit_1621(addr,6); //写入addr 的高6位 写数据命令xxxx xx
72. SendBit_1621(sdata,len); //写入8/4位 sdata数据 len=8/4
73. CSPIN=1;//送数完成后置高电平
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 系统振荡器开 100 0 0000 0010
82. SendCmd_1621(RCosc);
83. //RCosc 0x30 内部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显示 偏压发生器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为数据,8为8位数据
100. addr+=2; //顺延2个4位地址码
101. }
102. }
|