打印

请教各位大虾义隆EM78P447芯片问题,

[复制链接]
2801|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ytmkkk1986|  楼主 | 2009-11-18 08:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在出的问题是,乱七八糟的显示,状态,程序没有按
没仿真器也不能调试;请问各位中断里面有没有问题!
还有我的24C02读写也正常的啊,别的显示也正常显示过!
按键也正确,能听到每一次按下去蜂鸣器都有响,长按也响!
就是不知道哪里出问题了!还忘各位不舍赐教!
原程序如下:
/ 工业控制;
* EM78P447;28DIP;
* 4MHZ晶振,4 clocks;
* 共阳三位数码管;
* 2009.10.29;
* xie.pin;
*/
#include"Em78x447xx.h"
#define  DISI() _asm{disi}
#define  ENI() _asm{eni}
#define  SLEP() _asm{slep}
#define  NOP() _asm{nop}
#define  WDTC()  _asm{wdtc}
/**宏定义**/
#define  uchar unsigned char
#define  ushort unsigned short
#define  time_KEY1  0X10  //调时;P74
#define  aotu_KEY4  0X20  //加;  P75   //修改;
#define  sub_KEY3  0X40  //减;  P76
#define  add_KEY2  0X80  //自动;P77   //修改;
#define  liquid_KEY5  0X01  //液位开关;R60
#define  liquid_KEY6  0X02  //备用; R61
#define  On_delay R53   //开启继电器;
#define  Buzzer  R52   //蜂鸣器;
#define  Led_cr  R63   //LED亮灭控制;
#define  Yellow  R75
#define  Green  R74
#define  Red   R73
/**全局变量**/
uchar tcc_count = 0;  //计时到50次,为1秒;
uchar second = 0;   //秒初始值;
uchar set_state = 0;  //系统状态标致;
ushort key_time = 0;
ushort user_time_second = 5;  //调节,用户自己设定的时间;键盘设定的值;
ushort user_time_minute = 1;  //用户自己设定的加油等待时间;
uchar H_second_buf = 0;
uchar L_second_buf = 5;
uchar H_minute_buf = 0;
uchar L_minute_buf = 1;
  
uchar H_second = 0;  //超过256时的用户设置的秒user_time的高位;
uchar L_second = 5;
uchar H_minute = 0;  //超过256时的用户设置的分user_time的高位;
uchar L_minute = 1;
  //百位,十位,个位;
uchar dis_num[3] = {0,0,1}; //初始化显示程序;显示存储器;
ushort dis_buf = 1;   //显示缓冲数据;
/**位定义**/
bit  skey_flag = 0;   //20MS键盘扫描标致位;
bit  wait_flag = 0;   //等待时间;加油标致位"1时";
bit  aotu_flag = 0;   //手动加油标致位;
//uchar  aotu_num  = 0;
/***常量定义***/
const uchar seg_duan[13] = {
//0   1   2   3   4   5   6   7   8   9 //0x40"-",0xff"open",0x00"close"
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff,0x00
};
const uchar seg_wei[3] = {
//seg1,seg2,seg3;
0x10,0x20,0x40
};
const uchar  duan_bit[7] = {
//R71,R67,R73, R74, R75, R70, R72;
0x01,0x02,0x04,0x08,0x10,0x20,0x40
};

相关帖子

沙发
ytmkkk1986|  楼主 | 2009-11-18 08:36 | 只看该作者
/****************************************
*
*                          the main;                                        *
*
****************************************/
void main()@page 0
{
        init();
        tcc_init();
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
        if(P&&T)Buzzer = 1;
        delay(250);       
       
        P6CR |= 0X04;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
       
        WDTC();
        c02_flag = 0;
        while(c02_flag == 0)ircvstr(0,&H_minute_buf,1);
        WDTC();
        c02_flag = 0;
        while(c02_flag == 0)ircvstr(1,&L_minute_buf,1);
        WDTC();
        c02_flag = 0;
        while(c02_flag == 0)ircvstr(2,&H_second_buf,1);
        WDTC();
        c02_flag = 0;
        while(c02_flag == 0)ircvstr(3,&L_second_buf,1);
        WDTC();

        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
        H_second = H_second_buf;
        L_second = L_second_buf;
        user_time_second = (ushort)H_second_buf*250 + (ushort)L_second_buf;

        H_minute = H_minute_buf;
        L_minute = L_minute_buf;
        user_time_minute = (ushort)H_minute_buf*250 + (ushort)L_minute_buf;

        wait_flag = 1;
        set_state = 0;
        second = 0;
        TCC = 178;
        ENI();
       
        while(1){
                                WDTC();       
                                NOP();NOP();NOP();NOP();
                                NOP();NOP();NOP();NOP();
                                /*扫描键盘*/
                                scankey();

                                /**长击计数**/
                                NOP();NOP();NOP();NOP();
                                NOP();NOP();NOP();NOP();
                                if((Cont & time_KEY1)||(Cont & add_KEY2)||(Cont & sub_KEY3)){
                                        key_time++;
                                }else{
                                        key_time=0;
                                }
                                /**按键鸣响**//**液位报警控制**/
                                if(((key_time == 100)&&(Cont & time_KEY1))||(Trg != 0)||(Cont & liquid_KEY5)||(Cont & liquid_KEY6)){
                                        Buzzer = 1;
                                }else{
                                        Buzzer = 0;
                                }
                                WDTC();       
                                /**状态设置**/
                                if((key_time == 100) && (Cont & time_KEY1)){
                                                On_delay = 0;
                                                set_state++;
                                                if(set_state == 3){
                                                        H_second_buf = (uchar)(user_time_second/250);
                                                        L_second_buf = (uchar)(user_time_second%250);
                                                        H_minute_buf = (uchar)(user_time_minute/250);
                                                        L_minute_buf = (uchar)(user_time_minute%250);
                                                        WDTC();
                                                       
                                                        DISI();
                                                        H_second = H_second_buf;
                                                        L_second = L_second_buf;
                                                        H_minute = H_minute_buf;
                                                        L_minute = L_minute_buf;


                                                        P6CR |= 0X04;
                                                        NOP();NOP();NOP();NOP();
                                                        NOP();NOP();NOP();NOP();
                                                       
                                                        WDTC();
                                                        c02_flag = 0;
                                                        while(c02_flag == 0)isendstr(0,&H_minute_buf,1);
                                                        WDTC();
                                                        c02_flag = 0;
                                                        while(c02_flag == 0)isendstr(1,&L_minute_buf,1);
                                                        WDTC();
                                                        c02_flag = 0;
                                                        while(c02_flag == 0)isendstr(2,&H_second_buf,1);
                                                        WDTC();
                                                        c02_flag = 0;
                                                        while(c02_flag == 0)isendstr(3,&L_second_buf,1);
                                                       
                                                        wait_flag = 1;
                                                        set_state = 0;
                                                        second = 0;
                                                        TCC = 178;                                                       
                                                        ENI();                                                       
       
                                                }       
                                }
                                WDTC();
                                NOP();NOP();NOP();NOP();
                                NOP();NOP();NOP();NOP();
                                /**用户手动加油,启动和停止**/
                                /**按一下启动,加油状态再按一下停止加油**/
                                if((set_state == 0) && (Cont & aotu_KEY4)){
                                                H_second = H_second_buf;
                                                L_second = L_second_buf;
                                                wait_flag = 1;
                                }
                               
                                if((set_state == 0) && (Trg & time_KEY1)){
                                                H_minute = H_minute_buf;
                                                L_minute = L_minute_buf;
                                                wait_flag = 0;
                                }

                                /*设置加油时间*/
                                if(set_state == 1){       
                                                On_delay = 0;
                                                if((key_time > 80)||Trg){
                                                                if((Cont & add_KEY2) || (Trg & add_KEY2)){                        //短击,长击;
                                                                        user_time_second++;
                                                                        if(user_time_second == 1000)
                                                                                        user_time_second = 1;
                                                                }
                                                                if((Cont & sub_KEY3) || (Trg & sub_KEY3)){
                                                                        user_time_second--;
                                                                        if(user_time_second == 0)
                                                                                        user_time_second = 999;
                                                                }                               
                                                }
                       
                                }
                                /*设置等待时间*/
                                if(set_state == 2){
                                                On_delay = 0;
                                                if((key_time > 80) || Trg){                                                                        //短击,长击;
                                                                if((Cont & add_KEY2) || (Trg & add_KEY2)){
                                                                        user_time_minute++;
                                                                        if(user_time_minute == 1000)
                                                                                        user_time_minute = 1;
                                                                }
                                                                if((Cont & sub_KEY3) || (Trg & sub_KEY3)){
                                                                        user_time_minute--;
                                                                        if(user_time_minute == 0)
                                                                                        user_time_minute = 999;
                                                                }                       
                                                }
                       
                                }
                        /**增强程序抗干挠*
                        if((set_state == 1)||(set_state == 2)||(set_state == 0)){NOP();}                        //注;第一次写时出错处;
                        else{
                                set_state = 0;
                        }                               
                        if(set_state > 3)set_state = 0;*/
                while(1){

                        /**灯指示及显示程序**/
                        WDTC();
                        NOP();NOP();NOP();NOP();
                        NOP();NOP();NOP();NOP();
                        P7CR &= 0xc0;
                        P6CR = 0X77;
                        NOP();NOP();NOP();NOP();
                        NOP();NOP();NOP();NOP();
                        R63 = 0;
                        R67 = 1;
                        PORT7 |= 0X07;
                        NOP();NOP();NOP();NOP();
                        NOP();WDTC();NOP();
                       
                        if((Cont & liquid_KEY5)||(Cont & liquid_KEY6)){
                       
                                On_delay = 0;

                                Yellow = 0;
                                Red = 1;
                                Green = 0;

                                delay(200);
                                NOP();WDTC();
                                Led_cr = 1;
                                NOP();NOP();
                                PORT7 |= 0X38;
                                delay(100);WDTC();

                                NOP();NOP();
                                dip_seg3(888);
                        }else{
                                        if(set_state == 0){                                                //正常模式;
                                                        if(wait_flag){
                                                                        On_delay = 1;
                                                                        Yellow = 0;
                                                                        Red = 0;
                                                                        Green = 1;
                                                                       
                                                                        delay(200);NOP();WDTC();
                                                                        Led_cr = 1;
                                                                        NOP();NOP();
                                                                        PORT7 |= 0X38;
                                                                        delay(100);WDTC();
                                                                       
                                                                        NOP();NOP();
                                                                        dis_buf = (ushort)H_second*250 + (ushort)L_second;
                                                                        dip_seg3(dis_buf);
                                                        }else{
                                                                        On_delay = 0;
                                                                        Yellow = 1;
                                                                        Red = 0;
                                                                        Green = 0;
                                                                       
                                                                        delay(200);NOP();WDTC();
                                                                        Led_cr = 1;
                                                                        NOP();NOP();
                                                                        PORT7 |= 0X38;
                                                                        delay(100);WDTC();
                                                                       
                                                                        NOP();NOP();
                                                                        dis_buf = (ushort)H_minute*250 + (ushort)L_minute;
                                                                        dip_seg3(dis_buf);
                                                        }
                                        }else{
                                                        On_delay = 0;       
                                                        if(set_state == 1){                                //设置自动加油时间;
                                                                Red = 1;
                                                                Yellow = 0;
                                                                Green = 1;
                                                               
                                                                delay(200);NOP();WDTC();
                                                                Led_cr = 1;
                                                                NOP();NOP();
                                                                PORT7 |= 0X38;
                                                                delay(100);WDTC();
                                                                dip_seg3(user_time_second);
                                                        }
                                                        if(set_state == 2){                        //设置等待时间;
                                                                Yellow = 1;
                                                                Red = 1;
                                                                Green = 0;
                                                               
                                                                delay(200);NOP();WDTC();
                                                                Led_cr = 1;       
                                                                NOP();NOP();
                                                                PORT7 |= 0X38;
                                                                delay(100);WDTC();
                                                                dip_seg3(user_time_minute);
                                                        }
                                        }
                        }
                        WDTC();                       
                        if(set_state!=0)On_delay=0;
//                        if(wait_flag == 0)On_delay = 0;
                        /*执行大循环条件*/
                        if(skey_flag){
                                skey_flag=0;
                                break;
                        }
                        if(set_state == 0){
                                        if(tcc_count >= 50){
                                                tcc_count = 0;
                                                if(wait_flag == 0){
                                                                second++;
                                                                if(second == 60){
                                                                        second = 0;
                                                                        L_minute--;
                                                                        if(L_minute == 0){
                                                                                if(H_minute == 0){
                                                                                        wait_flag = 1;
                                                                                        H_second = H_second_buf;
                                                                                        L_second = L_second_buf;
                                                                                }else{
                                                                                        H_minute--;
                                                                                        L_minute = 250;
                                                                                }
                                                                        }
                                                                }
                                                }else{
                                                                L_second--;
                                                                if(L_second == 0){
                                                                        if(H_second == 0){
                                                                                wait_flag = 0;
                                                                                H_minute = H_minute_buf;
                                                                                L_minute = L_minute_buf;
                                                                        }else{
                                                                                H_second--;
                                                                                L_second = 250;
                                                                        }
                                                                }               
                                                }
                                        }
                        }
                       
                }
        }       
}

void _intcall INTTERRUPT(void) @ int
{   
  // Write your code (inline assembly or C) here
        _asm{
                MOV A, 0X10
                MOV 0X3C, A
                MOV A, 0X11
                MOV 0X3B, A
                MOV A, 0X12
                MOV 0X3A, A
                MOV A, 0X13
                MOV 0X39, A
                MOV A, 0X14
                MOV 0X38, A
                MOV A, 0X15
                MOV 0X37, A
                MOV A, 0X16
                MOV 0X36, A
                MOV A, 0X17
                MOV 0X35, A
                MOV A, 0X18
                MOV 0X34, A
                MOV A, 0X19
                MOV 0X33, A
                MOV A, 0X1a
                MOV 0X32, A
        }
        TCC = 178;
        _asm{
                CLR 0x3f
        }
        skey_flag = 1;
        tcc_count++;

        //restore c systerm
        _asm{
                BS 0X04, 6
                BS 0X04, 7
                MOV A, 0X3C
                MOV 0X10, A
                MOV A, 0X3B
                MOV 0X11, A
                MOV A, 0X3A
                MOV 0X12, A
                MOV A, 0X39
                MOV 0X13, A
                MOV A, 0X38
                MOV 0X14, A
                MOV A, 0X37
                MOV 0X15, A
                MOV A, 0X36
                MOV 0X16, A
                MOV A, 0X35
                MOV 0X17, A
                MOV A, 0X34
                MOV 0X18, A
                MOV A, 0X33
                MOV 0X19, A
                MOV A, 0X32
                MOV 0X1a, A
        }
  //restore ACC,R3,R4
  _asm
   {
         reti
     BS 0X4,6        //If switch to register page 3 in restore C system inline assembly,
     BS 0X4,7        //in this inline assembly can neglect.
     SWAPA 0X3E-1
     MOV 0X3,A
     SWAPA 0X3F-1
     MOV 0X4,A
     SWAP 0X1F
     SWAPA 0X1F
   }
       
}

void _intcall INTERRUPT_l(void) @ 0x1:low_int 0
{
  //backup ACC,R3,R4
  _asm
   {
     MOV 0X1F,A
     SWAPA 0X4
     BS 0X4,6
     BS 0X4,7
     MOV 0X3F-1,A
     SWAPA 0X3
     MOV 0X3E-1,A
     BC 0X03,5
     BC 0X03,6
   }         

}

使用特权

评论回复
板凳
ytmkkk1986|  楼主 | 2009-11-18 09:03 | 只看该作者
void delay(uchar de)
{
        for(;de>0;de--){NOP();}
}

/**************************************************
*                                display
*
*R70~R75,R67 ARE duan out;R64,R65,R66 ARE wei out;
*
*
**************************************************/       
void display(uchar wei,uchar duan)  //写SEG段;write wei;
{
        uchar j;
        //write duan;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
        P7CR &= 0XC0;
        P6CR &= 0X07;
        NOP();NOP();NOP();NOP();
       
        P6CR |= 0X04;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
    PORT6&= 0X8F;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
        Led_cr=1;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();

        if(duan & duan_bit[0])R71 = 1;
        else R71 = 0;
        if(duan & duan_bit[1])R67 = 1;
        else R67 = 0;
        if(duan & duan_bit[2])R73 = 1;
        else R73 = 0;
        if(duan & duan_bit[3])R74 = 1;
        else R74 = 0;
        if(duan & duan_bit[4])R75 = 1;
        else R75 = 0;
        if(duan & duan_bit[5])R70 = 1;
        else R70 = 0;
        if(duan & duan_bit[6])R72 = 1;
        else R72 = 0;
       
        //write wei;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
    PORT6 |= wei;
    WDTC();NOP();
        for(j=200;j>0;j--){NOP();}
    NOP();NOP();WDTC();
    PORT6 &= 0X0F;
    PORT7 &= 0XC0;
    NOP();NOP();  
        for(j=100;j>0;j--){NOP();}
        NOP();WDTC();
}

void dip_seg3(ushort num)
{
        uchar i = 0;
        dis_num[0] = (uchar)(num/100);
        if(dis_num[0] == 0)dis_num[0] = 12;
       
        dis_num[1] = (uchar)(num%100/10);
        if(dis_num[0] == 12)
                if(dis_num[1] == 0)dis_num[1] = 12;
       
        dis_num[2] = (uchar)(num%10);
        if(dis_num[0] == 12)
                if(dis_num[1] == 12)
                        if(dis_num[2] == 0)dis_num[2] = 12;
        WDTC();               
        for(i=0;i<3;i++){
                display(seg_wei[i],~seg_duan[dis_num[i]]);
                WDTC();       
        }
}
/***************************************
*                                keysan
*
*R74,R75,R76,R77,ARE IN;R62 IS OUT "0";
*
***************************************/
uchar        Trg;        //tregger;         
uchar        Cont;        //continue;
uchar        Save_key;

void scankey(void)
{
        uchar R_data;
        uchar temp;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
        P7CR |= 0XF0;
        P6CR = 0XF3;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
        PORT6 &= 0X8F;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
        R62 = 0;
        R63 = 1;
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();       

        WDTC();
        temp = ((PORT6^0xff)&0X03)|((PORT7^0xff)&0XF0);
        NOP();NOP();NOP();NOP();
        if(temp == Save_key ){
                R_data = ((0xff^PORT7)&0xf0)|((0Xff^PORT6)&0x03);
                Trg = R_data&(R_data^Cont);
                Cont = R_data;
        }else{
                Save_key=temp;
        }

}
/******************************************
*
*        4MHZ/4/256=3.90625KHZ;
*        T = 1/3.90625kHz = 256us;
*        time = (256-178)*256us = 19.968ms;
*  TCC interrupt one time is 19.968ms;
*        TCC = 178;
*
******************************************/
void tcc_init(void)
{
        _asm{
                contr
                and a,@0xd0
                or a,@0x07
                contw
        }
        IMR = 0x01;
}

void init(void)
{
        P5CR = 0X00;
        P6CR = 0XFF;
        P7CR = 0XFF;
       
        PORT5 = 0x00;
        PORT6 = 0XFF;
        PORT7 = 0XFF;

        WUCR = 0xff;                 //Disable Port6 wakeup
        _asm{
                contr
                and a,@0xf7
                contw
        }
        WDTC();
        WDTCR = 0x31;                 //Enable Wdt
        NOP();
}

使用特权

评论回复
地板
zhaoyu2005| | 2009-11-18 12:41 | 只看该作者
开发平台应该有软件仿真功能,自己看下

使用特权

评论回复
5
ytmkkk1986|  楼主 | 2009-11-18 14:01 | 只看该作者
义隆不支持软仿啊,WICEPLUS不支持

使用特权

评论回复
6
qingqi202| | 2009-11-18 14:23 | 只看该作者
义隆不支持软件仿真的,需要447的仿真器的话可以找我呀,价格优惠

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

83

帖子

0

粉丝