📄 keyled.c
字号:
{
*MCRC = *MCRC & 0xfff1; /* 配置PWM9、8、7为IO
/*
bit 15 0: reserved
bit 14 0: 0=IOPF6, 1=IOPF6
bit 13 0: 0=IOPF5, 1=TCLKINB
bit 12 0: 0=IOPF4, 1=TDIRB
bit 11 0: 0=IOPF3, 1=T4PWM/T4CMP
bit 10 0: 0=IOPF2, 1=T3PWM/T3CMP
bit 9 0: 0=IOPF1, 1=CAP6
bit 8 0: 0=IOPF0, 1=CAP5/QEP4
bit 7 0: 0=IOPE7, 1=CAP4/QEP3
bit 6 0: 0=IOPE6, 1=PWM12
bit 5 0: 0=IOPE5, 1=PWM11
bit 4 0: 0=IOPE4, 1=PWM10
bit 3 0: 0=IOPE3, 1=PWM9
bit 2 0: 0=IOPE2, 1=PWM8
bit 1 0: 0=IOPE1, 1=PWM7
bit 0 1: 0=IOPE0, 1=CLKOUT
*/
*PEDATDIR = 0x0e0d; /*** ConfigurePWM9、8、7 pin as an OUTPUT ***/
/****output pwm9\8 = high pwm7=low**********/
/*
bit 15-8 0: EnDIR 1 = output, 0 = input
bit 7-0 0: IOPEn in--1=high,0=low; out--1=high,0=low
*/
}
//--------------------------------------------------------------------
// 函数名称 : void delay_25ms(void)
// 函数说明 : 25ms延迟
// 输入参数 : 无
// 输出参数 : 无
//--------------------------------------------------------------------
void delay_25ms()
{
UINT16 i,j;
for(i=0;i<=1000;i++);
for(j=0;j<=250;j++); //延迟250*1000*CLKOUT=250000*CLKOUT
//1/CLKOUT=0.1us
}
//--------------------------------------------------------------------
// 函数名称 : void cs_high(void)
// 函数说明 : 片选置高
// 输入参数 : 无
// 输出参数 : 无
//--------------------------------------------------------------------
void cs_high()
{
asm(" setc xf");
}
//--------------------------------------------------------------------
// 函数名称 : void cs_low(void)
// 函数说明 : 片选置低
// 输入参数 : 无
// 输出参数 : 无
//--------------------------------------------------------------------
void cs_low()
{
asm(" clrc xf");
}
//--------------------------------------------------------------------
// 函数名称 : void send(void)
// 函数说明 : 发送一个字节 8BIT,高位在前
// 输入参数 : 发送数据在全局变量send_buff中
// 输出参数 : 无
//--------------------------------------------------------------------
void send()
{
UINT16 i;
cs_low(); //片选CS=0
delay_50us(); //延时50us
for(i=0;i<8;i++)
{
switch(send_buff&0x80)
{
case 0x00:* PEDATDIR = * PEDATDIR & 0xfffb; //7279data低
break;
case 0x80:* PEDATDIR = * PEDATDIR | 0x0004; //7279data高
}
* PEDATDIR=* PEDATDIR | 0x0002; //7279clk高
delay_8us();
* PEDATDIR=* PEDATDIR & 0xfffd; //7279clk低
delay_8us();
send_buff<<=1;
}
// cs_high(); //片选CS=1
//这时,7279CS=1,7279CLK=0
}
//--------------------------------------------------------------------
// 函数名称 : void receive(void)
// 函数说明 : 接收一个字节 8BIT,高位在前
// 输入参数 : 接收到的数据在全局变量rece_buff中
// 输出参数 : 无
//--------------------------------------------------------------------
void receive()
{
UINT16 i;
* PEDATDIR = * PEDATDIR & 0xFBF7; //iope2 配置为输入脚,7279发数据
//iope3 = '0',准备接收数据
delay_50us();
for(i=0;i<8;i++)
{
* PEDATDIR=* PEDATDIR|0x0002; //7279clk高
delay_8us();
data_buff=data_buff|((* PEDATDIR & 0x0004)<<(13-i));//读iope2引脚数据;
//把接收到数据放在BIT15~8
* PEDATDIR=* PEDATDIR & 0xFFFD; //7279clk低
delay_8us();
}
asm(" nop "); //在这里设置断点观察data_buff中的值
rece_buff=(data_buff>>8) & 0x00ff; //接收到的数据右移给rece_buff
data_buff=0x0000; //清除data_buff
* PEDATDIR=* PEDATDIR | 0x040c; //iope2配置为输出脚=1,7279收数据
//iope3配置为'1',接收7279的数据
}
//--------------------------------------------------------------------
// 函数名称 : void int1(void)
// 函数说明 : 中断1的子程序
// 输入参数 : 无
// 输出参数 : 无
//--------------------------------------------------------------------
interrupt void int1() //中断1中断子程序
{
UINT16 temp;
temp = *PVIR;
* IFR=0xFFFF; //清除所有中断标志,"写1清0"
if(temp = 0x0001)
{
* XINT1CR=*XINT1CR | 0x8000; //清xint1中断标志
send_buff = CMD_READ; //读键值指令
send();
receive();
asm(" nop ");
send_buff = RTL_UNCYL; //数据左移指令
send();
send_buff = DECODE1;
send();
send_buff = rece_buff; //将接收到的键值送显示
send();
show = ~show;
}
cs_high(); //7279CS置高
asm(" clrc INTM"); //开总中断
return;
}
/*
***********************************************************
- 函数名称 : void Delay(int numbers)
- 函数说明 : 延时
- 输入参数 : numbers
- 输出参数 : 无
***********************************************************
*/
void Delay(UINT16 numbers)
{
UINT16 i,j;
for(i=0;i<40000;i++);
for(j=0;j<numbers;j++);
}
/*
***********************************************************
- 函数名称 : interrupt void PHANTOM(void)
- 函数说明 : 伪中断子程序
- 输入参数 : 无
- 输出参数 : 无
***********************************************************
*/
interrupt void nothing(void)
{
* IFR=0xFFFF; //清除所有中断标志,"写1清0"
asm(" clrc INTM"); //开总中断
return;
}
/*
************************************************************
****************** 主函数 *******************
************************************************************
*/
void main()
{
UINT16 temp;
//----------系统初始化-------------------------------
asm(" nop ");
cpu_init(); //初始化CPU
asm(" nop ");
iope_init(); //初始化IOPE设置寄存器
asm(" nop ");
//---------------------------------------------------
//while(1) //用于测试延迟脉冲宽度的程序
//{
// asm(" clrc xf");
// delay_50us();
// asm(" setc xf");
// delay_50us();
//}
//-----------7279复位--------------------------------
asm(" nop ");
send_buff = CMD_RESET; //复位指令
send();
delay_25ms(); //25ms延迟 --复位延迟
Delay(100);
asm(" nop ");
//-----------7279测试--------------------------------
send_buff = CMD_TEST; //测试指令
send();
Delay(90000);
Delay(90000);
Delay(90000);
asm(" nop ");
//-----------7279复位--------------------------------
send_buff = CMD_RESET; //复位指令
send();
delay_25ms(); //25ms延迟 --复位延迟
Delay(100);
asm(" nop ");
//-----------7279显示 0\1\2---f----------------------
for(temp=0;temp<16;temp++) //送出数据0x00~0x0F
{
send_buff = DECODE1;
send();
send_buff = temp;
send();
Delay(90000);
send_buff = RTL_UNCYL; //数据左移指令
send();
Delay(90000);
}
//-----------7279复位--------------------------------
send_buff = CMD_RESET; //复位指令
send();
//-----------7279CS='1'-----------------------------
cs_high();
//-----------外部中断1初始化------------------------
xint1_init(); //外部中断1初始化子程序
asm(" nop ");
//----------- 等待键盘中断--------------------------
while(1)
{
port8001 = show;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -