单片机源程序如下:
#define KEY_COUNT_DESHAKING 15//按键消抖时间15MS
#define KEY_COUNT_LONGT 1500//长按按键判断时间1500MS
#define KEY_COUNT_DUAL 180//双击按键判断时间180MS
#define KEY_LONG_REPEAT 200//长按按键时响应的时间间隔200MS
#define I2C_SCL P3_2
#define I2C_SDA P3_3
#define led P5_4
#include <STC8HX.h>
uint32 sys_clk = 12000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "Lib/EC11_51.h"//声明库头文件
#include "delay.h"
uint8 i = 0;
uint8 j = 0;
uint8 k = 20;
uint16 vol = 0;
uint8 flag = 0;
uint8 cnt = 0;
uint16 mylist[21]={0x88aa,0x8aa,0xa0aa,0x20aa,0x80aa,0xaa,0xaa2a,0x2a2a,0x8a2a,0xa2a,0xa22a, 0x222a,0x822a,0x22a,0xa82a,0xa282a,0x882a,0x82a,0xa02a,0x202a,0x802a};
uint8 dat = 0x2f;
uint16 scl_dat = 0xaa;
uint8 scl_dat2 = 0x01;
uint8 LR = 0x02;
uint8 jianhc_A1;
void sendbyte_LR();
void sendbyte_dat();
void sendbyte_3();
void Timer1Init(void) //1000微秒@12.000MHz
{
AUXR &= 0xbf; //定时器时钟12T模式
TMOD &= 0x0f; //设置定时器模式
TL1 = 0x18; //设定定时初值
TH1 = 0xfc; //设定定时初值
}
void Timer0Init(void) //1000微秒@12.000MHz
{
AUXR &= 0x7f; //定时器时钟12T模式
TMOD &= 0xf0; //设置定时器模式
TL0 = 0x18; //设定定时初值
TH0 = 0xfc; //设定定时初值
}
void T_IRQ0(void) interrupt 1 using 1{
cnt = cnt + 1;
}
xdata tongdaoHC HC_A1 = {0,0,0,0,0,0,0};//声明A1通道全局结构体缓存
void T_IRQ1(void) interrupt 3 using 2{
HC_A1.EC11_A_dq = P3_5;
HC_A1.EC11_B_dq = P3_6;
HC_A1.EC11_D_dq = P3_4;
jianhc_A1 = Encoder_EC11_Scan(&HC_A1);
switch ( jianhc_A1)
{
case 1:
if(k >= 1){
k = k - 1;
}
else{
k = k - 0;
}
break;
case 2:
if(k >= 1){
k = k - 1;
}
else{
k = k - 0;
}
break;
case 3:
if(k <= 20){
k = k + 1;
}
else{
k = k + 0;
}
break;
case 4:
if(k <= 20){
k = k + 1;
}
else{
k = k + 0;
}
break;
case 5:
led = !led;
if(k >= 1){
k = k - 1;
}
else{
k = k - 0;
}
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
}
/*描述该功能...
*/
void sendbyte_LR(){
for (i = 0; i < 1; i = i + 1) {
I2C_SDA = 1;
delay5us();
I2C_SCL = 1;
delay5us();
I2C_SDA = 0;
delay5us();
I2C_SCL = 0;
delay5us();
delay5us();
I2C_SCL = 1;
delay5us();
delay5us();
I2C_SCL = 0;
delay5us();
}
}
/*描述该功能...
*/
void sendbyte_dat(){
EA = 0;
sendbyte_LR();
for (j = 0; j < 16; j = j + 1) {
if((vol&0x8000) != 0){
P3_3 = 1;
}
else{
P3_3 = 0;
}
vol = (vol<<1);
delay1us();
delay1us();
if((scl_dat&0x8000) != 0){
P3_2 = 1;
}
else{
P3_2 = 0;
}
scl_dat = (scl_dat<<1);
delay5us();
}
sendbyte_3();
EA = 1;
}
/*描述该功能...
*/
void sendbyte_3(){
I2C_SCL = 0;
delay1us();
delay1us();
I2C_SDA = 1;
delay1us();
delay1us();
I2C_SCL = 1;
delay5us();
I2C_SDA = 1;
delay5us();
I2C_SCL = 0;
delay1us();
delay1us();
I2C_SDA = 0;
delay5us();
}
void setup()
{
P3M1&=~0x04;P3M0|=0x04;//推挽输出
P3M1&=~0x08;P3M0|=0x08;//推挽输出
P3M1&=~0x10;P3M0&=~0x10;//双向IO口
P5M1&=~0x10;P5M0|=0x10;//推挽输出
P3_3 = 0;
P5_4 = 1;
Timer1Init();
EA = 1; // 控制总中断
ET1 = 1; // 控制定时器中断
TR1 = 1;// 定时器1开始计时
Timer0Init();
EA = 1; // 控制总中断
ET0 = 1; // 控制定时器中断
TR0 = 1;// 定时器0开始计时
P3M1|=0x10;P3M0&=~0x10;//P3_4高阻输入
P3M1|=0x40;P3M0&=~0x40;//P3_6高阻输入
P3M1|=0x20;P3M0&=~0x20;//P3_5高阻输入
}
void loop()
{
if(cnt >= 200){
cnt = 0;
vol = mylist[(int)(k)];
scl_dat = 0xaaaa;
sendbyte_dat();
}
}
void main(void)
{
setup();
while(1){
loop();
}
}
以上代码下载:
M62429.zip
(143.64 KB, 下载次数: 0)
|