📄 ch452.lst
字号:
1: /********************************************************************************************
2: CH452驱动程序
3: 与单片机接口方式:4线
4: ********************************************************************************************/
5: #include <pic.h>
6:
7: typedef unsigned int uint;
8: typedef unsigned char uchar;
9: unsigned int Led_seg[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,
10: 0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x02,0x01}; //*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,.的字符码*/
11: unsigned int Bitmap[]={0xc00,0xd00,0xe00,0xf00,0x800,0x900,0xa00,0xb00}; //显示用位码列表
12: //管脚定义
13: #define CH452_DCLK RD0 // 串行数据时钟上升沿激活
14: #define CH452_DIN RD1 // 串行数据输出,接CH452的数据输入
15: #define CH452_LOAD RD2 // 串行命令加载,上升沿激活
16: #define CH452_DOUT RB0 // INT0,键盘中断和键值数据输入,接CH452的数据输出
17: // 4线接口的位操作,与单片机有关
18: #define CH452_DCLK_SET (CH452_DCLK=1)
19: #define CH452_DCLK_CLR (CH452_DCLK=0)
20: #define CH452_DIN_SET (CH452_DIN=1)
21: #define CH452_DIN_CLR (CH452_DIN=0)
22: #define CH452_LOAD_SET (CH452_LOAD=1)
23: #define CH452_LOAD_CLR (CH452_LOAD=0)
24: // 与单片机有关,与中断连接方式有关
25: #define DISABLE_INTERRUPT (INTE=0)
26: #define ENABLE_INTERRUPT (INTE=1)
27: #define CLEAR_INTER_FLAG (INTF=0)
28:
29: //命令码
30: #define CH452_NOP 0x0000 // 空操作
31: #define CH452_RESET 0x0201 // 复位
32: #define CH452_LEVEL 0x0100 // 加载光柱值
33: #define CH452_CLR_BIT 0x0180 // 段位清0
34: #define CH452_SET_BIT 0x01C0 // 段位置1
35: #define CH452_SLEEP 0x0202 // 进入睡眠状态
36: #define CH452_LEFTMOV 0x0300 //设置移动方式-左移
37: #define CH452_LEFTCYC 0x0301 //设置移动方式-左循
38: #define CH452_RIGHTMOV 0x0302 //设置移动方式-右移
39: #define CH452_RIGHTCYC 0x0303 //设置移动方式-右循
40: #define CH452_SELF_BCD 0x0380 //自定义BCD码
41: #define CH452_SYSOFF 0x0400 //关显示、键盘(设置系统参数)
42: #define CH452_SYSON1 0x0401 //开显示 (设置系统参数)
43: #define CH452_SYSON2 0x0403 //开显示、键盘 (设置系统参数)
44: #define CH452_SYSON2W 0x0423 //开显示、键盘, 真正2线接口 (设置系统参数)
45: #define CH452_DSP 0x0500 //设置默认显示方式 (设置显示参数)
46: #define CH452_BCD 0x0580 //设置BCD译码方式
47: #define CH452_TWINKLE 0x0600 //设置闪烁控制
48: #define CH452_GET_KEY 0x0700 // 获取按键
49:
50:
51: void InitCh452();
52: void WrietCh452(uint da);
53: void DelayUs();
54: void Bit_Display_Num(uint bite,uint buf);
55: void Display_Reset();
56: void Flash_SingleBit(uint bitnumber);
57: uint ReadCh452();
58: void Flash_AllBit();
59: void display(uint keyda);
60: void IntKey();
61: //系统初始化函数*/
62: void initial()
63: {
64: INTCON=0x00;
65: ADCON1=0x07;
66: PIE1=0;
67: PIE2=0;
68: }
69:
70: /********************************************************************************************
71: 初始化
72: ********************************************************************************************/
73: void InitCh452()
74: {
75: WrietCh452(CH452_SYSON2); //打开显示
76: WrietCh452(CH452_DSP); //设置默认方式
77: ENABLE_INTERRUPT;
78: //Display_Reset();
79: }
80:
81: /********************************************************************************************
82: 向CH452发送指令和数据
83: da;指令和数据
84: ********************************************************************************************/
85: void WrietCh452(uint da)
86: {
87: uint iq0;
88: DISABLE_INTERRUPT; //关闭键盘中断
89: CH452_LOAD_CLR; //复位LOAD信号
90: for(iq0=0;iq0<12;iq0++)
91: {
92: if((da&0x0001)==1)
93: CH452_DIN_SET;
94: else
95: CH452_DIN_CLR;
96: CH452_DCLK_CLR;
97: da >>=1;
98: CH452_DCLK_SET; //CH452上升沿读取数据
99: }
100: CH452_LOAD_SET; //加载数据,LOAD上升沿
101: DelayUs();
102: ENABLE_INTERRUPT; //打开键盘中断
103: }
104: /*--------------------------------------------------------------------------------------------
105: 单个位上显示数据
106: ---------------------------------------------------------------------------------------------*/
107: void Bit_Display_Num(uint bite,uint buf)
108: {
109: WrietCh452(Bitmap[bite]+Led_seg[buf]);
110: }
111: /****************************************************************
112: 显示复位
113: ****************************************************************/
114: void Display_Reset()
115: {
116:
117: WrietCh452(0x201);
118: }
119: /*--------------------------------------------------------------------------------------------
120: 单个位的闪烁操作
121: ---------------------------------------------------------------------------------------------*/
122: void Flash_SingleBit(uint bitnumber)
123: {
124: WrietCh452(CH452_TWINKLE+(0x01<<bitnumber));
125: }
126: /*--------------------------------------------------------------------------------------------
127: 全闪操作
128: ---------------------------------------------------------------------------------------------*/
129: void Flash_AllBit()
130: {
131: WrietCh452(CH452_TWINKLE+0xff);
132: }
133: /***************************************************************************************
134: 从CH452读取按键值
135: 返回:读取的按键值
136: ***************************************************************************************/
137: uint ReadCh452()
138: {
139: uchar q0;
140: uint cmd,keycode; //定义命令字,和数据存储器
141: DISABLE_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
142: cmd=0x07; //输入读451命令字
143: CH452_LOAD_CLR;
144: for(q0=0;q0<4;q0++)
145: {
146: if ((cmd&0x1)==1)
147: CH452_DIN_SET;
148: else
149: CH452_DIN_CLR; //输出位数据
150: CH452_DCLK_CLR;
151: cmd>>=1; //向右移一位
152: CH452_DCLK_SET; //产生时钟上升沿锁通知CH451输入位数据
153: }
154: CH452_LOAD_SET; //产生加载上升沿通知CH451处理命令数据
155: keycode=0; //清除按键码
156: for(q0=0;q0<7;q0++)
157: {
158: keycode<<=1; //数据移入keycode,高位在前,低位在后
159: keycode|=CH452_DOUT; //从高到低读入451的数据
160: CH452_DCLK_CLR; //产生时钟下降沿通知CH451输出下一位
161: CH452_DCLK_SET;
162: }
163: CLEAR_INTER_FLAG; //清中断标志
164: ENABLE_INTERRUPT;
165: return(keycode); //返回键值
166: }
167: void display(uint keyda)
168: {
169: Bit_Display_Num(0,keyda);
170: }
171: /***************************************************************************************
172: 按键中断函数
173: ***************************************************************************************/
174: void interrupt IntKey()
175: {
176: uint key;
177: key=ReadCh452();
178:
179: display(key);
180: }
181: /***************************************************************************************
182: 延时
183: ***************************************************************************************/
184: void DelayUs()
185: {
186: asm("nop");
187: asm("nop");
188: asm("nop");
189:
190: }
191:
192: void main()
193: {
194: uint i;
195: TRISD=0x00;
196: CLEAR_INTER_FLAG;
197: initial();
198: InitCh452();
199: GIE=1;
200: for(i=0;i<8;i++)
201: {
202: Bit_Display_Num(i,i);
203: }
204:
205: }
206:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -