📄 driver.c
字号:
#include "global.h"
static volatile unsigned int *P_IOA_Data = (unsigned int*)(0x7000);
static volatile unsigned int *P_IOA_Buffer = (unsigned int*)(0x7001);
static volatile unsigned int *P_IOA_Dir = (unsigned int*)(0x7002);
static volatile unsigned int *P_IOA_Attrib = (unsigned int*)(0x7003);
static volatile unsigned int *P_IOB_Data = (unsigned int*)(0x7005);
static volatile unsigned int *P_IOB_Dir = (unsigned int*)(0x7007);
static volatile unsigned int *P_IOB_Attrib = (unsigned int*)(0x7008);
//static unsigned int *P_Watchdog_Clear = (unsigned int*)(0x7012);
static volatile unsigned int *P_TimerA_Data = (unsigned int*)(0x700A);
static volatile unsigned int *P_TimerA_Ctrl = (unsigned int*)(0x700B);
static volatile unsigned int *P_TimerB_Data = (unsigned int*)(0x700C);
static volatile unsigned int *P_TimerB_Ctrl = (unsigned int*)(0x700D);
static volatile unsigned int *P_System_clock = (unsigned int*)(0x7013);
static volatile unsigned int *P_INT_Ctrl = (unsigned int*)(0x7010);
static volatile unsigned int *P_INT_Clear = (unsigned int*)(0x7011);
static volatile unsigned int *P_ADC_Ctrl = (unsigned int*)(0x7015);
static volatile unsigned int *P_ADC_MUX_Ctrl = (unsigned int*)(0x702B);
static volatile unsigned int *P_ADC_MUX_DATA = (unsigned int*)(0x702C);
static volatile unsigned int *P_Flash_Ctrl = (unsigned int*)(0x7555);
static volatile unsigned int *P_DAC_Ctrl = (unsigned int*)(0x702A);
static volatile unsigned int *P_DAC2 = (unsigned int*)(0x7016);
static volatile unsigned int *P_DAC1 = (unsigned int*)(0x7017);
///////////////////////////////////////////////////////////////////////////////
void driver_initial(){
*P_IOA_Dir=0xfff6;
*P_IOA_Attrib=0xfff6;
*P_IOA_Data=0xfff6;
*P_IOB_Dir=0x0320;
*P_IOB_Attrib=0x0320;
*P_IOB_Data=0x0324;
*P_DAC_Ctrl=0x0000;
*P_INT_Ctrl=0x0540;
*P_System_clock=0x0080;
}
//////////////////////////////////////////////////////////////////////////
void set_PWM() {
*P_TimerA_Ctrl=0x0230;
*P_TimerA_Data=0xffd9;
}
void del_PWM(){
*P_TimerA_Ctrl=0x0030;
*P_IOB_Data = ((*P_IOB_Data) & ~0x000a) | 0x0300;
}
//////////////////////////////////////////////////////////////////////////////
static int a[]={0x3f00,0x0600,0x5b00,0x4f00,0x6600,0x6d00,0x7d00,0x0700,0x7f00,0x6f00,0x0000,0x4000};
static int b[] = {0x0020, 0x0010, 0x0004, 0x0002};
//static int b[]={0x0004,0x0008,0x0010,0x0020};
void show_digit(int shift,int num,int dot){
dot=dot<<15;
dot=dot&0x8000;
*P_IOA_Data = (*P_IOA_Data & 0x00c9) | (a[num]|b[shift]|dot);
}
/* in fact 0.5 ms */
void delay_1ms(unsigned int addition){
*P_INT_Ctrl= *P_INT_Ctrl |0x0400;
*P_TimerB_Ctrl = 0x0002;
//*P_TimerB_Data=0xffe0;
addition = addition * 2 + 16;
addition = 0 - addition;
*P_TimerB_Data = addition;
//*P_TimerB_Data = 0xff99;
}
///////////////////////////////////////////////////////////////////////////////
void IRQ2(void) __attribute__((ISR)); //delay 1ms
void IRQ2(void) {
time_up=1;
*P_INT_Ctrl=*P_INT_Ctrl&0xfbff;
*P_INT_Clear=0x0400;
}
/////////////////////////////////////////////////////////////////////////////////
void IRQ3(void) __attribute__((ISR));
void IRQ3(void){
red_interrupt_callback();
*P_INT_Clear=0x0100;
}
static volatile int key_state1 = 0; // low level
static volatile int key_cnt1 = 0;
static volatile int key_state2 = 0; // low level
static volatile int key_cnt2 = 0;
void key1() {
if (key_state1 == 0) {
if (((*P_IOB_Data)&0x0008) == 0) { // still low
key_cnt1 = 0;
} else {
key_cnt1++;
if (key_cnt1 >= 100) {
key_state1 = 1;
key_cnt1 = 0;
key_dec_press_callback();
}
}
} else { // key state = 1;
if (((*P_IOB_Data)&0x0008) != 0) { // still high
key_cnt1 = 0;
} else {
key_cnt1++;
if (key_cnt1 >= 100) {
key_state1 = 0;
key_cnt1 = 0;
}
}
}
}
void key2() {
if (key_state2 == 0) {
if (((*P_IOB_Data)&0x0002) == 0) { // still low
key_cnt2 = 0;
} else {
key_cnt2++;
if (key_cnt2 >= 100) {
key_state2 = 1;
key_cnt2 = 0;
key_inc_press_callback();
}
}
} else { // key state = 1;
if (((*P_IOB_Data)&0x0002) != 0) { // still high
key_cnt2 = 0;
} else {
key_cnt2++;
if (key_cnt2 >= 100) {
key_state2 = 0;
key_cnt2 = 0;
}
}
}
}
/*
static int flag1,flag2;
static int num1,num2,num3,num4;
void key1(){
if(!flag1){
if(*P_IOB_Data&0x0008){
num1++;
num2=0;
if(num1>100){
key_dec_press_callback();
flag1=flag1^0x0001;
}
}
} else {
num1=0;
if(!(*P_IOB_Data&0x0008)){
num2++;
if(num2>100) flag1=flag1^0x0001;
}
}
}
void key2(){
if(!flag2){
if(*P_IOB_Data&0x0002){
num3++;
num4=0;
if(num3>100){
key_inc_press_callback();
flag2=flag2^0x0001;
}
}
}
if(flag2){
num3=0;
if(!(*P_IOB_Data&0x0002)){
num4++;
if(num4>100) flag2=flag2^0x0001;
}
}
}
*/
void set_dac(int sound)
{
*P_DAC1 = sound;
*P_DAC2 = sound;
}
/////////////////////////////////////////////////////////////////////////////////////
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void){
key1();
key2();
timer_4kHz_callback();
*P_INT_Clear=0x0040;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -