📄 jyzno1.c
字号:
}
//LCDMEM[pianh_cnt+6]=LCD_TAB1[pianh[pianh_cnt]];
LCDMEM[6]=LCD_TAB1[pianh[0]];
LCDMEM[7]=LCD_TAB1[pianh[1]];
blink_dat=pianh[pianh_cnt];
break;
case 7: //可在01 - 30 内进行设置
if(--fc_pianh==0)fc_pianh=30;
LCDMEM[6]=LCD_TAB1[fc_pianh/10];
LCDMEM[7]=LCD_TAB1[fc_pianh%10];
blink_dat=fc_pianh%10;
break;
case 8: break;//通讯模式
}
}
}
//************************************************
void key_mainloop(void)
{
if(!f_20ms) return;
f_20ms=0;
switch(keyfuntask)//功能键
{
case 0:/*有键按下*/
if((P4IN&BIT3)==0) keyfuntask=1;
break;
case 1://延时去抖
keyfuntask=2;break;
case 2://确认有键
if((P4IN&BIT3)==0) {keyfuntask=3;}
else keyfuntask=0;
break;
case 3://等待释放
if((P4IN&BIT3)!=0) {keyfuntask=0;fkeyfun=1; lxf_mea=0;fcf_mea=0;}//按下功能键复测和连续测都停止
break;
}
if(lxf_mea==1||fcf_mea==1)return;//连续测量状态,其它键不考虑!
switch(keyoktask)//确认键
{
case 0:/*有键按下*/
if((P4IN&BIT4)==0) keyoktask=1;
break;
case 1://延时去抖
keyoktask=2;break;
case 2://确认有键
if((P4IN&BIT4)==0) {keyoktask=3;}
else keyoktask=0;
break;
case 3://等待释放
if((P4IN&BIT4)!=0) {keyoktask=0;fkeyok=1;}
break;
}
switch(keylefttask)//左移键
{
case 0:/*有键按下*/
if((P4IN&BIT5)==0) keylefttask=1;
break;
case 1://延时去抖
keylefttask=2;break;
case 2://确认有键
if((P4IN&BIT5)==0) {keylefttask=3;}
else keylefttask=0;
break;
case 3://等待释放
if((P4IN&BIT5)!=0) {keylefttask=0;fkeyleft=1;}
break;
}
switch(keydowntask)//减少键
{
case 0:/*有键按下*/
if((P4IN&BIT6)==0) keydowntask=1;
break;
case 1://延时去抖
keydowntask=2;break;
case 2://确认有键
if((P4IN&BIT6)==0)
{
if(mode==7){fkeydown=1;keydowncount=1;}
keydowntask=3;
}
else
{keydowntask=0;}
break;
case 3://等待释放
if((P4IN&BIT6)!=0) //释放
{
if(mode!=7){fkeydown=1;}
keydowntask=0;
}
else if(mode==7)//连击
{
if(++keydowncount==QDSJ)
{
keydowncount-=LJSJ;
fkeydown=1;
}
}
break;
}
switch(keyuptask)//增加键
{
case 0:/*有键按下*/
if((P4IN&BIT7)==0) keyuptask=1;
break;
case 1://延时去抖
keyuptask=2;break;
case 2://确认有键
if((P4IN&BIT7)==0)
{
if(mode==7){fkeyup=1;keyupcount=1;}
keyuptask=3;
}
else
{keyuptask=0;}
break;
case 3://等待释放
if((P4IN&BIT7)!=0)
{
if(mode!=7){fkeyup=1;}
keyuptask=0;
}
else if(mode==7)//连击
{
if(++keyupcount==QDSJ)
{
keyupcount-=LJSJ;
fkeyup=1;
}
}
break;
}
}
//************************************************
void lcd_disinit(void)
{
uchar i;
for (i=0;i<16;i++)
{
LCDMEM[i]=0x0;
}
for(i=1;i<8;i++)
{
LCDMEM[i]=LCD_TAB1[8];
}
for(i=9;i<16;i++)
{
LCDMEM[i]=LCD_TAB2[8];
}
}
//****************************
void lcd_off(void)
{
uchar i;
for (i=0;i<16;i++)
{
LCDMEM[i]=0x0;
}
}
//****************************
/*产生各种时间控制*/
void tim0_mainloop()
{ if(!f_10ms) return;
f_10ms=0;
if(--cnt_20ms==0)
{
cnt_20ms=INT20MSCOUNT;
f_20ms=1; /*20ms*/
if(--cnt_250ms==0)
{
cnt_250ms=INT250MSCOUNT;
f_250ms=1; /*250ms*/
if(--cnt_500ms==0)
{
cnt_500ms=INT500MSCOUNT;
f_500ms=1; /*500ms*/
if(--cnt_5s==0)
{
cnt_5s=INT5SCOUNT;
f_5s=1; /*1s*/
if(--cnt_20s==0)
{
cnt_20s=INT20SCOUNT;
f_20s=1; /*20秒*/
}
}
}
}
}
}
//****************************
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
uint temp;
temp=CCR0;
if(cp_no1==1)
{
cp_no1=0;
}
else
{
f_cap=1;
if(temp>ccr0_old)
{
timnew_dat= temp-ccr0_old;
}
else
{
timnew_dat=65536-ccr0_old+temp;
}
}
ccr0_old=temp;
cnt_70ms=0;
}
// Timer B0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0 (void)
{
f_10ms=1;
if(lxf_mea==1||fcf_mea==1)
{
if(++cnt_70ms>7){cnt_70ms=0;timnew_dat=65535;f_cap=1;}
}
}
//****************************
void lcd_blink(void)
{
if(f_500ms&&f_blink)
{
f_500ms=0;
switch(f_blink)
{
case 1: LCDMEM[blink_address] =LCD_TAB1[blink_dat];f_blink=2;break;
case 2: LCDMEM[blink_address] =0x0;f_blink=1;break;
case 3: LCDMEM[blink_address] =LCD_TAB2[blink_dat];f_blink=4;break;
case 4: LCDMEM[blink_address] =0x0;f_blink=3;break;
}
}
}
//****************************
void delay(uint m)
{
uint i,j;
for(j=m;j>0;j--)
{
for (i=10;i>0;i--);
}
}
//****************************
void main_init(void)
{
//PORT_INIT--BUZ
P4SEL &=~BIT2;//P4.2端口
P4DIR |=BIT2;//P4.2输出
//PORT_INIT--LED
P3SEL &=~BIT0;//P3.0端口
P3DIR |=BIT0;//P3.0输出
//PORT_INIT--KEY
P4SEL &=~(BIT3+BIT4+BIT5+BIT6+BIT7);
P4DIR &=~(BIT3+BIT4+BIT5+BIT6+BIT7); //K1,K2,K3,K4,K5 输入
//PORT_INIT--CAPTURE
P1SEL |=BIT0;//P1.0捕获
P1DIR &=~BIT0;//P1.0输入
//CLK_INIT MCLK(4M) ACLK(32768) SMCLK(1M)
SCFI0 |= FN_2; // x2 DCO frequency, 8MHz nominal DCO
SCFQCTL = 121; // (121+1) x 32768 x 2 = 7.99 Mhz
FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set so freq = xtal x D x N+1
FLL_CTL1 |=XT2OFF;
//TIMA_INIT--测频率--捕获模式,连续计数,溢出不中断,捕获中断--计数值存储在CCR0
//停止--先停捕获,再停计数
//TACCTL0 &= ~CM_3; // 禁止捕获
//TACTL &= ~MC_3; // 停止定时器---将MC0,MC1置成0
//重启--先开捕获,再开计数
//TACCTL0 |= CM_1; // 启动俘获--上升沿
//TACTL |= MC_2; // 选择连续增计数--启动定时器
TACTL = TACLR; // clear TAR
TACTL |= TASSEL_2; // 选择SMCLK做输入源--8M
TACTL |= ID_3; // 选择8分频--8M-->1M
TACTL &= ~MC_3; // 停止定时器---将MC0,MC1置成0
// TACTL |= MC_2; // 选择连续增计数--启动定时器
TACCTL0 &= ~CM_3; // 禁止捕获
// TACCTL0 |= CM_1; // 启动俘获--上升沿
TACCTL0 |= SCS; // 选择同步模式
TACCTL0 |= CAP; // 选择俘获模式
TACCTL0 |= CCIS_0;//CCI0A
TACCTL0 |= CCIE; // 中断允许
//TIMB_INIT--时钟
TBCTL = TBCLR; // clear TAR
TBCTL |= TBSSEL_1; // 选择ACLK做输入源--32768
TBCTL |= ID_3; // 选择8分频--32.768K-->4096
TBCTL |= MC_1; // 选择增计数至CCR0模式
TBCCTL0 = CCIE; // TBCCR0 interrupt enabled
// TBCTL |= TBIE; // 计时器溢出允许
TBCCR0 = 41;//约10ms中断
//LCD_INIT
BTCTL = BTFRFQ1; // STK LCD freq =32768/64分频
LCDCTL = LCDON + LCD4MUX + LCDP0+LCDP2; // STK LCD 4Mux, S0-S31
P5SEL = 0xfc; // Common and Rxx all selected
//FLASH_INIT
FCTL2 = FWKEY + FSSEL0 + FN0; // 设置时钟频率为ACLK
//UART_INIT
//EN_3221 P2.7
//OFF_3221 P2.6
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character
// UTCTL0 |= SSEL1; // UCLK = SMCLK
// UBR00 = 0x41; // 7.99MHz 9600
// UBR10 = 0x03; // 7.99MHz 9600
// UMCTL0 = 0x00; // no modulation
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // Initalize USART state machine
IE1 |= URXIE0; // Enable USART0 RX interrupt
P2DIR |= BIT4; // P2.4 output direction
P2SEL &=~BIT7;//P2.7端口
P2DIR |=BIT7;//P2.7输出
P2SEL &=~BIT6;//P2.6端口
P2DIR |=BIT6;//P2.6输出
P2OUT |=BIT7;// /EN=0;片选无效
P2OUT &= ~BIT6; // /OFF=0;关闭有效
// P2OUT |= BIT6; // /OFF=1;关闭无效
// P2OUT &= ~BIT7;// /EN=0;片选有效
/*串行口初始化完成,p2口定义完成*/
//VAR_INIT
fun_dat=1;
f_10ms=0;
lxf_mea=0;
rxddat_p=rxddat;//指向接收组和缓存组的指针
rxdbuf_p=rxdbuf;
rxddat_cnt=0;
rxdbuf_cnt=0;
}
//****************************************************
//****flash子程序*************
//擦除一段flash
void FlashErase(uint *addr)
{
_DINT();
FCTL3 = FWKEY;
FCTL1 = FWKEY+ERASE; //Erase
*addr = 10;
FCTL3 = FWKEY + LOCK;// Lock
_EINT();
}
//向flash写一个uint
void FlashWriteInt(uint *addr, uint data)
{
_DINT();
FCTL3 = FWKEY;
FCTL1 = FWKEY+WRT;
*addr = data;
FCTL3 = FWKEY + LOCK;// Lock
_EINT();
}
//向flash写一个uchar
void FlashWriteUchar(uchar *addr, uchar data)
{
_DINT();
FCTL3 = FWKEY;
FCTL1 = FWKEY+WRT;
*addr = data;
FCTL3 = FWKEY + LOCK;// Lock
_EINT();
}
//向flash写一个float
void FlashWriteFloat(uint *addr,float data)
{
uint *pdata;
pdata = (uint*)&data;
FlashWriteInt(addr,*pdata);
pdata++;
addr++;
FlashWriteInt(addr,*pdata);
}
/**************************************************************
*读Flash中多个字节 addr:读地址 length:要读取的字节数 readBuf:用以存储读取内容的缓存区地址
***************************************************************/
void read_Flash(uchar * addr,uchar * rbuf,uchar len)
{
uint cnt;
_DINT();
for(cnt=0;cnt<len;cnt++)
{
*(rbuf+ cnt) = *(addr + cnt); // 读数据
}
_EINT();
}
/**************************************************************
*写多个字节到Flash addr:地址 buf:要写数据的首地址 len:写入的字节数
***************************************************************/
void write_Flash(char*addr,char*buf,int len)
{
uint cnt;
_DINT();
FCTL1 = FWKEY + WRT; // 准备写
FCTL3 = FWKEY;
for(cnt=0;cnt<len;cnt++)
{
*(addr+cnt) = *(buf + cnt); // 写数据
}
FCTL3 = FWKEY + LOCK; // Lock
_EINT();
}
/**************************************************************
*擦Flash addr:512字节擦除区内任一地址
**************************************************************/
void erase_Flash(char* addr)
{
_DINT();
FCTL3 = FWKEY; // 清除 "Lock"
FCTL1 = FWKEY + ERASE;// 准备擦除
*addr = 2;// 擦除,写任意数均可
FCTL3 = FWKEY + LOCK;// 置“LOCK”
_EINT();
}
//***************************
void send16(uint txdat)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = txdat>>8;
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = (uchar)(txdat);
}
//***************************
void send8(uchar txdat)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = txdat;
}
//63 5b 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DC 0d 0a
//220 30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -