📄 shukong3.c
字号:
#include<spce061a_chf.h>
#define Uint unsigned int
typedef struct
{
Uint bit0 : 1;
Uint bit1 : 1;
Uint bit2 : 1;
Uint bit3 : 1;
Uint bit4 : 1;
Uint bit5 : 1;
Uint bit6 : 1;
Uint bit7 : 1;
Uint bit8 : 1;
Uint bit9 : 1;
Uint bit10 : 1;
Uint bit11 : 1;
Uint bit12 : 1;
Uint bit13 : 1;
Uint bit14 : 1;
Uint bit15 : 1;
}Bit;
typedef struct
{
Uint bytel : 8;
Uint byteh : 8;
}Byte;
typedef union
{
Bit bit;
Byte byte;
Uint port;
}UNport;
#define PA ((volatile UNport *)(0x7000))
#define PA_Buffer ((volatile UNport *)(0x7001))
#define PA_Dir ((volatile UNport *)(0x7002))
#define PA_Attrib ((volatile UNport *)(0x7003))
#define PA_Latch ((volatile UNport *)(0x7004))
#define PB ((volatile UNport *)(0x7005))
#define PB_Buffer ((volatile UNport *)(0x7006))
#define PB_Dir ((volatile UNport *)(0x7007))
#define PB_Attrib ((volatile UNport *)(0x7008))
#define P0_0 PA->bit.bit0
#define P0_1 PA->bit.bit1
#define P0_2 PA->bit.bit2
#define P0_3 PA->bit.bit3
#define P0_4 PA->bit.bit4
#define P0_5 PA->bit.bit5
#define P0_6 PA->bit.bit6
#define P0_7 PA->bit.bit7
#define P0_8 PA->bit.bit8
#define P0_9 PA->bit.bit9
#define P0_10 PA->bit.bit10
#define P0_11 PA->bit.bit11
#define P0_12 PA->bit.bit12
#define P0_13 PA->bit.bit13
#define P0_14 PA->bit.bit14
#define P0_15 PA->bit.bit15
#define P1_0 PB->bit.bit0
#define P1_1 PB->bit.bit1
#define P1_2 PB->bit.bit2
#define P1_3 PB->bit.bit3
#define P1_4 PB->bit.bit4
#define P1_5 PB->bit.bit5
#define P1_6 PB->bit.bit6
#define P1_7 PB->bit.bit7
#define P1_8 PB->bit.bit8
#define P1_9 PB->bit.bit9
#define P1_10 PB->bit.bit10
#define P1_11 PB->bit.bit11
#define P1_12 PB->bit.bit12
#define P1_13 PB->bit.bit13
#define P1_14 PB->bit.bit14
#define P1_15 PB->bit.bit15
#define startA 0x0031//4096&1
#define stopA 0x0036//0&0停止计数
void write_flash(void);//写存储区的数据
unsigned int read_flash();//读取存储取的数据
void page_erase();//檫除页
void write_command(unsigned int);//写命令
void write_data(unsigned int );//写数据
void check_busy();//检测busy信号
void lcd_init();//lcd初始化操作
void lcd_display(void);//显示操作
unsigned int key_scan();//按键扫描,有操作才进行显示和存储操作
void get_key();//获取键控的键值
void jiema_init();//解码中断初始化
unsigned int get_ma(void);//获取遥控码值
void delay();
unsigned int a[5]="K=150";
//unsigned int flag2;//遥控更新数据的标志
unsigned int num[8]={0};
unsigned int value;//表示增益数字
unsigned int k=5;//表示增益数字的位数
unsigned int *addr=0xf100;//要檫除的页地址
unsigned int flag;
int main()
{
unsigned int flag1=0;//按键和遥控改变的标志
Set_IOB_Dir(0xf0);
Set_IOB_Attrib(0xf4);
Set_IOB_Data(0x04);//外部中断为悬浮式输入
value=read_flash();
jiema_init();
lcd_init();
lcd_display();
Set_IOB_Data(((~(value/10))<<4)&0xf0);
while(1)
{
Watchdog_Clear();
if(flag==0)//没有外部中断的时候扫描键盘
{
flag1=key_scan();
if(flag1)
{
get_key();//直接是???的形式
flag1=0;
}
value=get_ma();
lcd_init();
lcd_display();
page_erase();
write_flash();
Set_IOB_Data(((~(value/10))<<4)&0xf0);
}
}
}
void write_flash()
{
*P_Flash_Ctrl=0xaaaa;
*P_Flash_Ctrl=0x5533;
*addr=value;
}
void page_erase(void)
{
*P_Flash_Ctrl=0xaaaa;
*P_Flash_Ctrl=0x5511;
*addr=0x0000;//向相应的页地址写如任意值;
}
unsigned int read_flash(void)
{
unsigned int data1;
data1=*addr;
return (data1);
}
//初始化函数
void lcd_init(void)
{
write_command(0x38);//显示模式的设置
write_command(0x08);//显示关闭*/
write_command(0x0c);//整体显示,关光标,不闪烁
write_command(0x06);//显示光标移动设置
write_command(0x01); //显示清屏
}
//写命令函数,IOA0~IOA2为控制端口,IOA8~IOA15为数据端口
void write_command(unsigned int command)
{
check_busy();
Set_IOA_Dir(0xff07);
Set_IOA_Attrib(0xff07);
PA->byte.byteh=command;//操作高8位
P0_0=0;//rs=0
P0_1=0;//rw=0
P0_2=1;//E=1
asm("nop");
P0_2=0;//E=0;//下降沿触发
}
//写数据函数
void write_data(unsigned int data2)
{
check_busy();
Set_IOA_Dir(0xff07);
Set_IOA_Attrib(0xff07);
PA->byte.byteh=data2;//操作高8位
P0_0=1;//rs=1
P0_1=0;//rw=0
P0_2=1;//E=1
asm("nop");
P0_2=0;//E=0;//下降沿触发
}
void check_busy()
{
unsigned int c;
Set_IOA_Dir(0x0007);
Set_IOA_Attrib(0xff07);
Set_IOA_Data(0xff00);//悬浮式输入
do
{
Watchdog_Clear();
P0_0=0;//rs=0
P0_1=1;//rw=1
P0_2=1;//E=1
c=PA->byte.byteh;//只读出高8位
P0_2=0;//E=0;
asm("nop");
c&=0x80;
}while(c==0x80);
}
unsigned int key_scan()
{
if(P1_0==1)
{
delay();
if(P1_0==1)
{
return(1);
}
}
else if(P1_1==1)
{
delay();
if(P1_1==1)
{
return(1);
}
}
else
{
return(0);
}
}
void get_key()
{
if(P1_0==1)
{
do{
Watchdog_Clear();
}while(P1_0==1);
if(value<150)//
{
if(value==1)
{
value=10;
}
else
{
value+=10;
}
}
}
if(P1_1==1)//'-10'
{
do
{
Watchdog_Clear();
}while(P1_1==1);//等待按键释放
if((value==10)|(value==1))
{
value=1;
}
else
{
value-=10;
}
}
}
void jiema_init()
{
//时钟的设置
*P_SystemClock=0x0013;//24.576--24.576/8
//定时器时钟的设置
Set_TimerA_Data(0x0000);//定时器A从0开始计数
Set_TimerA_Ctrl(stopA);//开始先不计数
//设置中断
*P_INT_Ctrl=0x0100;//开IRQ3_EXIT1中断
//开中断
asm("irq on");
}
unsigned int get_ma()
{
unsigned int i;
for(i=0;i<8;i++)
{
if(num[i]>130)
{
num[i]=1;
}
else
{
num[i]=0;
}
}
i=num[0]*128+num[1]*64+num[2]*32+num[3]*16+num[4]*8+num[5]*4+num[6]*2+num[7]*1;
switch(i)
{
case 0xff:return(1);break;
case 0x7f:return(10);break;
case 0xbf:return(20);break;
case 0x3f:return(30);break;
case 0xdf:return(40);break;
case 0x5f:return(50);break;
case 0x9f:return(60);break;
case 0x1f:return(70);break;
case 0xef:return(80);break;
case 0x6f:return(90);break;
case 0x87:return(100);break;
case 0x27:return(110);break;
case 0xa7:return(120);break;
case 0x07:return(130);break;
case 0x05:return(140);break;
case 0x95:return(150);break;
default:return(value);break;
}
}
void delay()
{
unsigned int r,e;
r=0;
while(r--)
{
e=0xfff;
while(e--)
{
Watchdog_Clear();
}
}
}
void lcd_display()
{
unsigned int l;
if((value>0)&(value<=150))
{
if(value>=100)
{
a[2]=value/100+48;
a[3]=(value-100)/10+48;
a[4]=0+48;
k=5;
}
else if((value>=10)&(value<100))
{
a[2]=value/10+48;
a[3]=0+48;
k=4;
}
else
{
a[2]=1+48;
k=3;
}
}
else
{
value=150;
}
for(l=0;l<k;l++)
{
write_data(a[l]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -