📄 main_new.c
字号:
// 0 外部中断0 IE0 0003H
// 1 定时器/计数器 TF0 000BH
// 2 外部中断1 IE1 0013H
// 3 定时器/计数器1 TF1 001BH
// 4 串行口 RI+TI 0023H
// 5 定时器/计数器2 TF2+EXF2 002BH;
// 6 ADCI 0033H;
// 7 ISPI/I2CI 003BH;
// 8 PSMI 0043H;
// 9 TII 0053H;
// 10 WDS 005BH;
#include<kei841.h>
#include<delay.h>
#include<I2C.h>
#define SAA1_WRITE_ADDR 0x70 //右边
#define SAA2_WRITE_ADDR 0x76 //左边
#define SAA1_READ_ADDR 0x71 //u3
#define SAA2_READ_ADDR 0x77 //u4
#define SAA_WORK_MODE_ALLON 0x77 //动态
#define SAA_WORK_MODE_ALLOFF 0x71 //全灭
char code LED_TABLE[]={
//0 1 2 3 4 5 6 7 8 9
0x7E,0x12,0xBC,0xB6,0xD2,0xE6,0xEE,0x32,0xFE,0xF2,
//A B C D E F . L
0xFA,0xCE,0x6C,0x9E,0xEC,0xE8,0x01,0x4C
};
char code values[64][2]={//正弦数据DAC
{0x07, 0xFF},{0x08, 0xC8},{0x09, 0x8E},{0x0A, 0x51},{0x0B, 0x0F},
{0x0B, 0xC4},{0x0C, 0x71},{0x0D, 0x12},{0x0D, 0xA7},{0x0E, 0x2E},
{0x0E, 0xA5},{0x0F, 0x0D},{0x0F, 0x63},{0x0F, 0xA6},{0x0F, 0xD7},
{0x0F, 0xF5},{0x0F, 0xFF},{0x0F, 0xF5},{0x0F, 0xD7},{0x0F, 0xA6},
{0x0F, 0x63},{0x0F, 0x0D},{0x0E, 0xA5},{0x0E, 0x2E},{0x0D, 0xA7},
{0x0D, 0x12},{0x0C, 0x71},{0x0B, 0xC4},{0x0B, 0x0F},{0x0A, 0x51},
{0x09, 0x8E},{0x08, 0xC8},{0x07, 0xFF},{0x07, 0x36},{0x06, 0x70},
{0x05, 0xAD},{0x04, 0xEF},{0x04, 0x3A},{0x03, 0x8D},{0x02, 0xEC},
{0x02, 0x57},{0x01, 0xD0},{0x01, 0x59},{0x00, 0xF1},{0x00, 0x9B},
{0x00, 0x58},{0x00, 0x27},{0x00, 0x09},{0x00, 0x00},{0x00, 0x09},
{0x00, 0x27},{0x00, 0x58},{0x00, 0x9B},{0x00, 0xF1},{0x01, 0x59},
{0x01, 0xD0},{0x02, 0x57},{0x02, 0xEC},{0x03, 0x8D},{0x04, 0x3A},
{0x04, 0xEF},{0x05, 0xAD},{0x06, 0x70},{0x07, 0x36}};
unsigned int SINE_DAC_COUNT=0;
char xdata KEY_GET=0;
char xdata KEY_GET_PRE4=0;
char xdata KEY_GET_PRE3=0;
char xdata KEY_GET_PRE2=0;
char xdata KEY_GET_PRE1=0;
void LED_SHOW_ON_LEFT(DATA1,DATA2,DATA3,DATA4);
void LED_SHOW_ON_RIGHT(DATA1,DATA2,DATA3,DATA4);
void LED_SHOW_OFF_LEFT(void);
void LED_SHOW_OFF_RIGHT(void);
void external_int0(void) interrupt 0{ //键盘检测中断程序 IE0 cleared by hardware
// EA=0;
P03=1; //LED提示有键按下。
P2=0xFF;
delay2(255,255);
P20=0;
P21=1;
P22=1;
P23=1;
if(P24==0) KEY_GET=0x01;
else if(P25==0) KEY_GET=0x02;
else if(P26==0) KEY_GET=0x03;
else if(P27==0) KEY_GET=0x0f;
P20=1;
P21=0;
P22=1;
P23=1;
if(P24==0) KEY_GET=0x04;
else if(P25==0) KEY_GET=0x05;
else if(P26==0) KEY_GET=0x06;
else if(P27==0) KEY_GET=0x0E;
P20=1;
P21=1;
P22=0;
P23=1;
if(P24==0) KEY_GET=7;
else if(P25==0) KEY_GET=8;
else if(P26==0) KEY_GET=9;
else if(P27==0) KEY_GET=0x0D;
P20=1;
P21=1;
P22=1;
P23=0;
if(P24==0) KEY_GET=0x0A;
else if(P25==0) KEY_GET=0;
else if(P26==0) KEY_GET=0x0B;
else if(P27==0) KEY_GET=0x0C;
KEY_GET_PRE4=KEY_GET_PRE3;
KEY_GET_PRE3=KEY_GET_PRE2;
KEY_GET_PRE2=KEY_GET_PRE1;
KEY_GET_PRE1=KEY_GET;
LED_SHOW_ON_LEFT(LED_TABLE[KEY_GET_PRE4],LED_TABLE[KEY_GET_PRE3],LED_TABLE[KEY_GET_PRE2],(LED_TABLE[KEY_GET_PRE1])|0x01);
P2=0xF0;
delay3(255,255,23);
while((P2&0xf0)!=0xf0){}; //等待键抬起
IE0=0;
P03=0;
// EA=1;
}
void timer0(void) interrupt 1{
}
void UART_INT(void){
TI=0;
RI=0;
}
void timer2(void) interrupt 5{ //1ms interrupt
TF2=0; //清标志位
DACCON = 0x7B;
if(++SINE_DAC_COUNT>63) SINE_DAC_COUNT=0;
DAC0H = values[SINE_DAC_COUNT][0];
DAC0L = values[SINE_DAC_COUNT][1];
DACCON = 0x7F; //同步
}
void ADC_INT() interrupt 6{
// EA=0;
LED_SHOW_ON_RIGHT(LED_TABLE[(ADCDATAH>>4)&0x0f],
LED_TABLE[ADCDATAH&0x0f],
LED_TABLE[(ADCDATAL>>4)&0x0f],
LED_TABLE[ADCDATAL&0x0f]
);
SBUF=ADCDATAH;
delay2(255,128);
SBUF=ADCDATAL;
delay2(255,128);
SBUF=0x00;
// EA=1;
}
void LED_SHOW_ON_LEFT(DATA4,DATA3,DATA2,DATA1){
I2C_STRAT();
I2C_SendData(SAA2_WRITE_ADDR);
I2C_SendData(0x00);
I2C_SendData(SAA_WORK_MODE_ALLON);
I2C_SendData(DATA2); //左2
I2C_SendData(DATA1); //左1
I2C_SendData(DATA4); //左4
I2C_SendData(DATA3); //左3 4高位1低位
I2C_STOP();
delay2(255,12);
}
void LED_SHOW_ON_RIGHT(DATA4,DATA3,DATA2,DATA1){
I2C_STRAT();
I2C_SendData(SAA1_WRITE_ADDR);
I2C_SendData(0x00);
I2C_SendData(SAA_WORK_MODE_ALLON);
I2C_SendData(DATA2); //右2
I2C_SendData(DATA1); //右1
I2C_SendData(DATA4); //右4
I2C_SendData(DATA3); //右3 4高位1低位
I2C_STOP();
delay2(255,12);
}
void LED_SHOW_OFF_LEFT(){
I2C_STRAT();
I2C_SendData(SAA2_WRITE_ADDR);
I2C_SendData(0x00);
I2C_SendData(SAA_WORK_MODE_ALLOFF);
I2C_SendData(0); //左3
I2C_SendData(0); //左4
I2C_SendData(0); //左1
I2C_SendData(0); //左2 左--右-->1--4
I2C_STOP();
delay2(255,12);
}
void LED_SHOW_OFF_RIGHT(){
I2C_STRAT();
I2C_SendData(SAA1_WRITE_ADDR);
I2C_SendData(0x00);
I2C_SendData(SAA_WORK_MODE_ALLOFF);
I2C_SendData(0); //右3
I2C_SendData(0); //右4
I2C_SendData(0); //右1
I2C_SendData(0); //右2 左--右-->1--4
I2C_STOP();
delay2(255,12);
}
void main(void){
char i=0;
CFG841= 0x41; //xram enable
P0 = 0;
EA = 1;
TMOD = 0x31; //timer0 16bit timer ;timer1 is stopped;
TR0 = 1;
// ET0 = 1;
// PT0 = 1;
RCAP2L = 0xa8; //timer2 16bit timer; 1ms interrupt;
RCAP2H = 0xD4;
TR2 = 1;
ET2 = 1;
P2 = 0xF0; //键盘设置 低四位输出低高四位输出高 检测高四位电平
IT0 = 1; //沿中断
EX0 = 1; //开外部中断0
PX0 = 0; //高级优先级
I2C_MasterMode();
KEY_GET_PRE4=8;
KEY_GET_PRE3=8;
KEY_GET_PRE2=8;
KEY_GET_PRE1=8;
LED_SHOW_ON_LEFT(LED_TABLE[8],LED_TABLE[8],LED_TABLE[8],LED_TABLE[8]);
ADCCON1 = 0xD8; //core clock devided by 8;
//3 acquisition adc clock
//timer overflow flag start ADC
ADCCON2 = 0x00; //channel 0; single conversion
ADCCON3 = 0x00; //
EADC = 1; //开中断
T3CON = 0xC8; //串口设置 启用定时器3 波特率9600
T3FD = 0x08;
SCON = 0x70; //8bit 串口
// ES = 1; //开启 串口中断
while(1){
DAC0H = values[SINE_DAC_COUNT][0];
DAC0L = values[SINE_DAC_COUNT][1];
SCONV=1;
delay3(255,255,56);
LED_SHOW_OFF_LEFT();
delay3(255,255,56);
LED_SHOW_ON_LEFT((LED_TABLE[KEY_GET_PRE4])|0x01,
(LED_TABLE[KEY_GET_PRE3])|0x01,
(LED_TABLE[KEY_GET_PRE2])|0x01,
(LED_TABLE[KEY_GET_PRE1])|0x01
);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -